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 @@
-[1mdiff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m[m
-[1mindex e06c41f..f09a03e 100644[m
-[1m--- a/Classes/00_signals/Signal.m[m
-[1m+++ b/Classes/00_signals/Signal.m[m
-[36m@@ -172,11 +172,9 @@[m [mclassdef Signal[m
- [m
- hold on;[m
- if isempty(options.color)[m
-[31m- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);[m
-[31m- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1);[m
-[32m+[m[32m plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);[m[41m
[m
- else[m
-[31m- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);[m
-[31m- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Color',options.color);[m
-[32m+[m[32m plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);[m[41m
[m
- end[m
- % 2 c)[m
- % - xlabel if not already here: time in readable format (1 ms and not 1e-3 s)[m
-[1mdiff --git a/Classes/02_optical/DP_Fiber.m b/Classes/02_optical/DP_Fiber.m[m
-[1mindex a5f3dce..c1f08ea 100644[m
-[1m--- a/Classes/02_optical/DP_Fiber.m[m
-[1m+++ b/Classes/02_optical/DP_Fiber.m[m
-[36m@@ -24,6 +24,8 @@[m [mclassdef DP_Fiber[m
- SS_dzmax % [m] max dz (adaptive SSFM)[m
- SS_dzmin % [m] min dz (adaptive SSFM)[m
- n_waveplates % number of PMD waveplates[m
-[32m+[m[32m useGPU % GPU acceleration: true, false, or 'auto' (default)[m
-[32m+[m[32m useSingle % Use single precision on GPU (default: false)[m
- [m
- % ---- Internal state (persistent between calls) ----[m
- state % struct mirroring legacy 'state'[m
-[36m@@ -56,6 +58,8 @@[m [mclassdef DP_Fiber[m
- options.SS_dzmax = 2e4 % m[m
- options.SS_dzmin = 100 % m[m
- options.n_waveplates = 100[m
-[32m+[m[32m options.useGPU = 'auto' % 'auto', true, or false[m
-[32m+[m[32m options.useSingle = false % single precision GPU[m
- end[m
- [m
- % Copy provided options into properties[m
-[36m@@ -208,7 +212,7 @@[m [mclassdef DP_Fiber[m
- % Frequency-dependent PMD phase term (legacy form)[m
- st.brf.db0 = (R.rand(st.wave_plates,1)*2*pi - pi) * brf_multiplier;[m
- st.brf.db1 = sqrt(3*pi/8)*(st.dgd/obj.fa)/st.wave_plates .* st.omega;[m
-[31m- st.brf.simdgd = 0; [m
-[32m+[m[32m st.brf.simdgd = 0;[m
- % cumsum used in legacy only for debug; keep compatibility variable:[m
- ~cumsum(st.brf.db0); % no-op to mirror legacy path[m
- [m
-[36m@@ -228,7 +232,18 @@[m [mclassdef DP_Fiber[m
- x_in = signal_in(:,1).';[m
- y_in = signal_in(:,2).';[m
- [m
-[31m- [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state);[m
-[32m+[m[32m % Determine GPU usage[m
-[32m+[m[32m if ischar(obj.useGPU) || isstring(obj.useGPU)[m
-[32m+[m[32m if strcmpi(obj.useGPU, 'auto')[m
-[32m+[m[32m gpuFlag = []; % Let CNLSE_plain auto-detect[m
-[32m+[m[32m else[m
-[32m+[m[32m error('DP_Fiber:InvalidGPU', 'useGPU must be true, false, or ''auto''');[m
-[32m+[m[32m end[m
-[32m+[m[32m else[m
-[32m+[m[32m gpuFlag = logical(obj.useGPU);[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state, gpuFlag, obj.useSingle);[m
- [m
- obj.state.propagated_length = obj.state.propagated_length + obj.state.L;[m
- [m
-[1mdiff --git a/Classes/02_optical/Optical_Demultiplex.m b/Classes/02_optical/Optical_Demultiplex.m[m
-[1mindex 7d7c39e..8e272d2 100644[m
-[1m--- a/Classes/02_optical/Optical_Demultiplex.m[m
-[1m+++ b/Classes/02_optical/Optical_Demultiplex.m[m
-[36m@@ -42,7 +42,7 @@[m [mclassdef Optical_Demultiplex < handle[m
- [m
- function signalclasses_out = process(obj, signalclass_in)[m
- [m
-[31m- % ---- Infer wavelength: either given or from input total signal [m
-[32m+[m[32m % ---- Infer wavelength: either given or from input total signal[m
- if isempty(obj.wavelengthplan)[m
- obj.wavelengthplan = signalclass_in.lambda; %meter[m
- else[m
-[36m@@ -81,7 +81,7 @@[m [mclassdef Optical_Demultiplex < handle[m
- obj[m
- signal_in[m
- end[m
-[31m- [m
-[32m+[m
- w = obj.fs_out ./ obj.fs_in ;[m
- blocklen_in = length(signal_in);[m
- blocklen_out = w*blocklen_in;[m
-[36m@@ -119,30 +119,31 @@[m [mclassdef Optical_Demultiplex < handle[m
- N = size(lo,1);[m
- C = size(lo,2);[m
- [m
-[31m- x_envelopes = zeros(N, C, 'like', signal_in);[m
-[31m- y_envelopes = zeros(N, C, 'like', signal_in);[m
-[32m+[m[32m % ---- VECTORIZED: Process all channels in parallel ----[m
-[32m+[m[32m % Batched FFT operates on each column simultaneously on GPU[m
- [m
-[31m- s1 = signal_in(:,1);[m
-[31m- s2 = signal_in(:,2);[m
-[32m+[m[32m % Extract polarization signals[m
-[32m+[m[32m s1 = signal_in(:,1); % X polarization [N×1][m
-[32m+[m[32m s2 = signal_in(:,2); % Y polarization [N×1][m
- [m
-[31m- % Reusable work buffers (avoid reallocations)[m
-[31m- wrk_time = zeros(N,1, 'like', signal_in);[m
-[31m- wrk_freq = zeros(N,1, 'like', signal_in);[m
-[32m+[m[32m % Broadcast signal to all channels and multiply with LO[m
-[32m+[m[32m % s1, s2 are [N×1], lo is [N×C] → result is [N×C][m
-[32m+[m[32m x_mixed = att .* s1 .* lo; % [N×C][m
-[32m+[m[32m y_mixed = att .* s2 .* lo; % [N×C][m
-[32m+[m
-[32m+[m[32m % Batched FFT: each column computed in parallel[m
-[32m+[m[32m x_freq = fft(x_mixed); % [N×C][m
-[32m+[m[32m y_freq = fft(y_mixed); % [N×C][m
-[32m+[m
-[32m+[m[32m % Apply filter (H is [N×1], broadcasts across columns)[m
-[32m+[m[32m x_filtered = x_freq .* H; % [N×C][m
-[32m+[m[32m y_filtered = y_freq .* H; % [N×C][m
-[32m+[m
-[32m+[m[32m % Batched IFFT[m
-[32m+[m[32m x_envelopes = ifft(x_filtered); % [N×C][m
-[32m+[m[32m y_envelopes = ifft(y_filtered); % [N×C][m
- [m
-[31m- for c = 1:C[m
-[31m- % ---- X branch ----[m
-[31m- wrk_time(:) = att .* s1 .* lo(:,c); % N×1[m
-[31m- wrk_freq(:) = fft(wrk_time); % N×1[m
-[31m- wrk_freq(:) = wrk_freq .* H; % N×1[m
-[31m- x_envelopes(:,c) = ifft(wrk_freq); % N×1[m
- [m
-[31m- % ---- Y branch ----[m
-[31m- wrk_time(:) = att .* s2 .* lo(:,c);[m
-[31m- wrk_freq(:) = fft(wrk_time);[m
-[31m- wrk_freq(:) = wrk_freq .* H;[m
-[31m- y_envelopes(:,c) = ifft(wrk_freq);[m
-[31m- end[m
-[31m- [m
- end[m
- end[m
- end[m
-[1mdiff --git a/Classes/02_optical/Optical_Multiplex.m b/Classes/02_optical/Optical_Multiplex.m[m
-[1mindex 1d722b0..7fc8a33 100644[m
-[1m--- a/Classes/02_optical/Optical_Multiplex.m[m
-[1m+++ b/Classes/02_optical/Optical_Multiplex.m[m
-[36m@@ -1,10 +1,10 @@[m
- classdef Optical_Multiplex < handle[m
- % Takes a cell array of signals[m
-[31m- % returns a total field signal [m
-[31m- % WDM spacing is given in wavelength plan OR via delta_F [m
-[31m- [m
-[32m+[m[32m % returns a total field signal[m
-[32m+[m[32m % WDM spacing is given in wavelength plan OR via delta_F[m
-[32m+[m
- % The grid is stored in the output signal -> the demux will ideally[m
-[31m- % look this up and use this as the demux frequencies... [m
-[32m+[m[32m % look this up and use this as the demux frequencies...[m
- [m
- % signal_cell = {Opt_sig_1, Opt_sig_2};[m
- % Opt_sig_wdm = Optical_Multiplex("fs_in",Opt_sig.fs,"fs_out",4*Opt_sig.fs,...[m
-[36m@@ -117,7 +117,7 @@[m [mclassdef Optical_Multiplex < handle[m
- % adapt frequency shifts to match the FFT grid! Find nearest grid point[m
- [glitch(o),pos] = min(abs( freqaxis-obj.df_T(o) ));[m
- obj.df_T(o) = freqaxis(pos);[m
-[31m- [m
-[32m+[m
- polrots = [polrots, data_in{o}.polrot];[m
- end[m
- [m
-[36m@@ -139,25 +139,36 @@[m [mclassdef Optical_Multiplex < handle[m
- [m
- x_envelopes = NaN([blocklen_out N]);[m
- y_envelopes = x_envelopes;[m
-[31m- [m
-[31m- for o = 1:N[m
-[31m-[m
-[31m- pha = mod(2*pi*(0:blocklen_out-1)*obj.df_T(o)/obj.fs_out,2*pi).';[m
-[31m- lo = cos(pha)+1i*sin(pha);[m
-[31m- data_in_resampled = data_in{o}.resample("fs_out",obj.fs_out);[m
- [m
-[31m- res_env = ifft(fft(data_in_resampled.signal(:,1)).*H);[m
-[31m- x_envelopes(:,o) = att.*res_env.*lo;[m
-[32m+[m[32m % ---- OPTIMIZED: Pre-compute all LO phases as [blocklen_out × N] matrix ----[m
-[32m+[m[32m time_idx = (0:blocklen_out-1).'; % [blocklen_out × 1][m
-[32m+[m[32m lo_phases = mod(2*pi * time_idx * obj.df_T / obj.fs_out, 2*pi); % [blocklen_out × N][m
-[32m+[m[32m lo_all = cos(lo_phases) + 1i*sin(lo_phases); % [blocklen_out × N][m
- [m
-[31m- res_env = ifft(fft(data_in_resampled.signal(:,2)).*H);[m
-[31m- y_envelopes(:,o) = att.*res_env.*lo;[m
-[32m+[m[32m % Collect all resampled signals first (still requires loop due to cell array)[m
-[32m+[m[32m x_signals = zeros(blocklen_out, N);[m
-[32m+[m[32m y_signals = zeros(blocklen_out, N);[m
- [m
-[32m+[m[32m for o = 1:N[m
-[32m+[m[32m data_in_resampled = data_in{o}.resample("fs_out", obj.fs_out);[m
-[32m+[m[32m x_signals(:, o) = data_in_resampled.signal(:, 1);[m
-[32m+[m[32m y_signals(:, o) = data_in_resampled.signal(:, 2);[m
- end[m
- [m
-[32m+[m[32m % ---- VECTORIZED: Batched FFT/IFFT for all channels ----[m
-[32m+[m[32m % Apply filter to all channels at once[m
-[32m+[m[32m x_filtered = ifft(fft(x_signals) .* H); % [blocklen_out × N][m
-[32m+[m[32m y_filtered = ifft(fft(y_signals) .* H); % [blocklen_out × N][m
-[32m+[m
-[32m+[m[32m % Apply attenuation and LO shift to all channels[m
-[32m+[m[32m x_envelopes = att .* x_filtered .* lo_all; % [blocklen_out × N][m
-[32m+[m[32m y_envelopes = att .* y_filtered .* lo_all; % [blocklen_out × N][m
-[32m+[m
- data_out = data_in_resampled;[m
- data_out.signal = [sum(x_envelopes,2), sum(y_envelopes,2)];[m
- data_out.lambda = obj.lambda_T;[m
- data_out.polrot = polrots;[m
-[32m+[m
- end[m
- [m
- end[m
-[1mdiff --git a/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m b/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m[m
-[1mindex cfa7294..463adca 100644[m
-[1m--- a/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m[m
-[1m+++ b/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m[m
-[36m@@ -1,41 +1,72 @@[m
- [m
-[31m-function [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state)[m
-[31m- [m
-[31m-[m
-[31m-[m
-[31m- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[31m- % pre calculations[m
-[31m- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[31m-[m
-[31m- state.common_beta=struct('X',0,'Y',0);[m
-[31m-[m
-[31m- for n=1:2[m
-[31m- % get current polarization name and contrary one[m
-[31m- curPol = state.polNames{n};[m
-[32m+[m[32mfunction [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state,useGPU,useSingle)[m
-[32m+[m
-[32m+[m[32m% GPU auto-detection if not specified[m
-[32m+[m[32mif nargin < 4 || isempty(useGPU)[m
-[32m+[m[32m useGPU = canUseGPU();[m
-[32m+[m[32mend[m
-[32m+[m[32mif nargin < 5 || isempty(useSingle)[m
-[32m+[m[32m useSingle = false;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m[32m% pre calculations[m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m
-[32m+[m[32mstate.common_beta=struct('X',0,'Y',0);[m
-[32m+[m
-[32m+[m[32mfor n=1:2[m
-[32m+[m[32m % get current polarization name and contrary one[m
-[32m+[m[32m curPol = state.polNames{n};[m
-[32m+[m
-[32m+[m[32m % extend linear transfer function depending on beta values for the current polarization[m
-[32m+[m[32m % Was ist der Sinn dieser komischen beta notation? zB. state.beta.X = [0.3142 0 -9.1105e-28 5.1068e-41][m
-[32m+[m[32m for n_beta = 1:length(state.beta.(curPol))[m
-[32m+[m[32m state.common_beta.(curPol) = state.common_beta.(curPol) + state.beta.(curPol)(n_beta) * (state.omega).^(n_beta-1) / factorial(n_beta-1);[m
-[32m+[m[32m end[m
- [m
-[31m- % extend linear transfer function depending on beta values for the current polarization[m
-[31m- % Was ist der Sinn dieser komischen beta notation? zB. state.beta.X = [0.3142 0 -9.1105e-28 5.1068e-41][m
-[31m- for n_beta = 1:length(state.beta.(curPol))[m
-[31m- state.common_beta.(curPol) = state.common_beta.(curPol) + state.beta.(curPol)(n_beta) * (state.omega).^(n_beta-1) / factorial(n_beta-1);[m
-[32m+[m[32m %opt_out_struct.(curPol)=opt_in_struct.(curPol).envelope;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mbeta_const = state.beta.('X')(1);[m
-[32m+[m[32mbeta_1 = state.beta.('X')(2);[m
-[32m+[m[32mbeta_2 = state.beta.('X')(3);[m
-[32m+[m[32mbeta_3 = state.beta.('X')(4);[m
-[32m+[m[32mdeltaomega = state.omega;[m
-[32m+[m[32mbeta_x = beta_const + beta_1 * deltaomega + 1/2 * beta_2 * deltaomega.^2 + 1/6 *beta_3 * deltaomega.^3;[m
-[32m+[m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m[32m% GPU Transfer (if enabled)[m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m[32mif useGPU[m
-[32m+[m[32m % Convert to single precision if requested (faster on most GPUs)[m
-[32m+[m[32m if useSingle[m
-[32m+[m[32m opt_in_x = gpuArray(single(opt_in_x));[m
-[32m+[m[32m opt_in_y = gpuArray(single(opt_in_y));[m
-[32m+[m[32m state.common_beta.X = gpuArray(single(state.common_beta.X));[m
-[32m+[m[32m state.common_beta.Y = gpuArray(single(state.common_beta.Y));[m
-[32m+[m[32m state.brf.db1 = gpuArray(single(state.brf.db1));[m
-[32m+[m[32m state.brf.db0 = gpuArray(single(state.brf.db0));[m
-[32m+[m[32m for k = 1:numel(state.brf.matR)[m
-[32m+[m[32m state.brf.matR{k} = gpuArray(single(state.brf.matR{k}));[m
-[32m+[m[32m end[m
-[32m+[m[32m else[m
-[32m+[m[32m opt_in_x = gpuArray(opt_in_x);[m
-[32m+[m[32m opt_in_y = gpuArray(opt_in_y);[m
-[32m+[m[32m state.common_beta.X = gpuArray(state.common_beta.X);[m
-[32m+[m[32m state.common_beta.Y = gpuArray(state.common_beta.Y);[m
-[32m+[m[32m state.brf.db1 = gpuArray(state.brf.db1);[m
-[32m+[m[32m state.brf.db0 = gpuArray(state.brf.db0);[m
-[32m+[m[32m for k = 1:numel(state.brf.matR)[m
-[32m+[m[32m state.brf.matR{k} = gpuArray(state.brf.matR{k});[m
- end[m
-[31m-[m
-[31m- %opt_out_struct.(curPol)=opt_in_struct.(curPol).envelope; [m
- end[m
-[32m+[m[32mend[m
-[32m+[m
- [m
-[31m- beta_const = state.beta.('X')(1);[m
-[31m- beta_1 = state.beta.('X')(2);[m
-[31m- beta_2 = state.beta.('X')(3);[m
-[31m- beta_3 = state.beta.('X')(4);[m
-[31m- deltaomega = state.omega;[m
-[31m- beta_x = beta_const + beta_1 * deltaomega + 1/2 * beta_2 * deltaomega.^2 + 1/6 *beta_3 * deltaomega.^3; [m
-[31m- [m
-[31m-% opt_in_x = gpuArray(opt_in_x);[m
-[31m-% opt_in_y = gpuArray(opt_in_y);[m
-[31m-[m
-[31m- [m
-[31m- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[31m- % Split Step Method[m
-[31m- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m[32m% Split Step Method[m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
- [m
- % [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,...[m
- % state.lin_z_test,state.corr_length,state.n_plates_done,state.missing_dz,state.brf,state.common_beta,....[m
-[36m@@ -44,35 +75,33 @@[m [mfunction [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state)[m
- % [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,...[m
- % state.lin_z_test,state.corr_length,state.n_plates_done,state.missing_dz,state.brf,state.common_beta,....[m
- % state.chi,state.manakov,state.beat_len);[m
-[31m- [m
-[31m- % get nonlinear step size[m
-[31m- [state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin);[m
-[31m- %[state.dz] = getNLstepsize_original(state,opt_out_struct);[m
-[31m- [m
-[31m- state.n_step = 0;[m
-[31m- state.z_prop = 0;[m
-[31m- state.test_dz = [];[m
-[31m- state.powers = [];[m
- [m
-[31m- tic[m
-[32m+[m[32m% get nonlinear step size[m
-[32m+[m[32m[state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin);[m
-[32m+[m[32m%[state.dz] = getNLstepsize_original(state,opt_out_struct);[m
- [m
-[31m- while state.z_prop < state.L [m
-[32m+[m[32mstate.n_step = 0;[m
-[32m+[m[32mstate.z_prop = 0;[m
-[32m+[m[32mstate.test_dz = [];[m
-[32m+[m[32mstate.powers = [];[m
- [m
-[31m- % reduce step length (dz) if we are to overshoot the fiber length[m
-[31m- % (L) in the next step[m
-[31m- if state.z_prop + state.dz > state.L[m
-[31m- state.dz = state.L - state.z_prop;[m
-[31m- end[m
-[31m- [m
-[31m- % update step number (n)[m
-[31m- state.n_step=state.n_step+1;[m
-[32m+[m[32mwhile state.z_prop < state.L[m
- [m
-[31m- % append current step length to logbook (dzs)[m
-[31m- state.dzs(state.n_step)=state.dz;[m
-[32m+[m[32m % reduce step length (dz) if we are to overshoot the fiber length[m
-[32m+[m[32m % (L) in the next step[m
-[32m+[m[32m if state.z_prop + state.dz > state.L[m
-[32m+[m[32m state.dz = state.L - state.z_prop;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m % update step number (n)[m
-[32m+[m[32m state.n_step=state.n_step+1;[m
-[32m+[m
-[32m+[m[32m % append current step length to logbook (dzs)[m
-[32m+[m[32m state.dzs(state.n_step)=state.dz;[m
- [m
-[31m- [m
-[31m- % half linear step[m
-[31m- [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,...[m
-[32m+[m
-[32m+[m[32m % half linear step[m
-[32m+[m[32m [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,...[m
- state.corr_length,state.n_plates_done,state.missing_dz,state.n_step,...[m
- state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,...[m
- state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X]...[m
-[36m@@ -82,12 +111,12 @@[m [mfunction [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state)[m
- state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,...[m
- state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X);[m
- [m
-[31m- % complete nonlinear step[m
-[31m- [m
-[31m- [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);[m
-[31m- [m
-[31m- % half linear step [m
-[31m- [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,...[m
-[32m+[m[32m % complete nonlinear step[m
-[32m+[m
-[32m+[m[32m [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);[m
-[32m+[m
-[32m+[m[32m % half linear step[m
-[32m+[m[32m [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,...[m
- state.corr_length,state.n_plates_done,state.missing_dz,state.n_step,...[m
- state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,...[m
- state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X]...[m
-[36m@@ -97,24 +126,34 @@[m [mfunction [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state)[m
- state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,...[m
- state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X);[m
- [m
-[31m- % get nonlinear step size[m
-[31m- [state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin);[m
-[31m- %[state.dz] = getNLstepsize_original(state,opt_out_struct);[m
-[32m+[m[32m % get nonlinear step size[m
-[32m+[m[32m [state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin);[m
-[32m+[m[32m %[state.dz] = getNLstepsize_original(state,opt_out_struct);[m
- [m
- [m
-[31m- [m
-[31m- end[m
-[31m- [m
-[31m- toc[m
- [m
-[31m- [m
-[32m+[m[32mend[m
-[32m+[m
- [m
- [m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m[32m% GPU Gather (if enabled)[m
-[32m+[m[32m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[m
-[32m+[m[32mif useGPU[m
-[32m+[m[32m opt_out_x = gather(opt_in_x);[m
-[32m+[m[32m opt_out_y = gather(opt_in_y);[m
- [m
-[31m- opt_out_x = (opt_in_x);[m
-[31m- opt_out_y = (opt_in_y);[m
-[32m+[m[32m % Gather state arrays back to CPU[m
-[32m+[m[32m state.common_beta.X = gather(state.common_beta.X);[m
-[32m+[m[32m state.common_beta.Y = gather(state.common_beta.Y);[m
-[32m+[m[32m state.brf.db1 = gather(state.brf.db1);[m
-[32m+[m[32m state.brf.db0 = gather(state.brf.db0);[m
-[32m+[m[32m for k = 1:numel(state.brf.matR)[m
-[32m+[m[32m state.brf.matR{k} = gather(state.brf.matR{k});[m
-[32m+[m[32m end[m
-[32m+[m[32melse[m
-[32m+[m[32m opt_out_x = opt_in_x;[m
-[32m+[m[32m opt_out_y = opt_in_y;[m
-[32m+[m[32mend[m
- [m
-[31m-% opt_out_x = gather(opt_in_x);[m
-[31m-% opt_out_y = gather(opt_in_y);[m
-[31m- [m
- end[m
-\ No newline at end of file[m
-[1mdiff --git a/Classes/02_optical/dp_fiber_lib/canUseGPU.m b/Classes/02_optical/dp_fiber_lib/canUseGPU.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..84666bb[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/02_optical/dp_fiber_lib/canUseGPU.m[m
-[36m@@ -0,0 +1,20 @@[m
-[32m+[m[32mfunction canUse = canUseGPU()[m
-[32m+[m[32m%CANUSEGPU Check if a compatible GPU is available for parallel computing[m
-[32m+[m[32m% Returns true if MATLAB Parallel Computing Toolbox is available and[m
-[32m+[m[32m% a CUDA-capable GPU is detected.[m
-[32m+[m
-[32m+[m[32mcanUse = false;[m
-[32m+[m
-[32m+[m[32m% Check if Parallel Computing Toolbox is installed[m
-[32m+[m[32mif ~license('test', 'Distrib_Computing_Toolbox')[m
-[32m+[m[32m return;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m% Check for GPU device[m
-[32m+[m[32mtry[m
-[32m+[m[32m gpu = gpuDevice();[m
-[32m+[m[32m canUse = gpu.DeviceSupported;[m
-[32m+[m[32mcatch[m
-[32m+[m[32m canUse = false;[m
-[32m+[m[32mend[m
-[32m+[m[32mend[m
-[1mdiff --git a/Classes/02_optical/dp_fiber_lib/getNLstepsize.m b/Classes/02_optical/dp_fiber_lib/getNLstepsize.m[m
-[1mindex a70edb9..fd42eba 100644[m
-[1m--- a/Classes/02_optical/dp_fiber_lib/getNLstepsize.m[m
-[1m+++ b/Classes/02_optical/dp_fiber_lib/getNLstepsize.m[m
-[36m@@ -1,25 +1,25 @@[m
- [m
- function [rDZ] = getNLstepsize(ux,uy,gamma,dzmin,dzmax,dphimax,alpha_lin)[m
- [m
-[31m- [m
-[31m- maxPow = max(gamma.*max(real(ux).^2+imag(ux).^2+real(uy).^2+imag(uy).^2));[m
-[31m- [m
-[31m- Leff = dphimax/maxPow;[m
-[31m- alpha_lin = max([alpha_lin.X alpha_lin.Y]);[m
-[31m- nl_att_len_ratio = alpha_lin*Leff;[m
-[31m- [m
-[31m- if nl_att_len_ratio >= 1[m
-[31m- rDZ = dzmax;[m
-[32m+[m[32m% gather() handles gpuArray inputs - ensures scalar is on CPU for comparisons[m
-[32m+[m[32mmaxPow = gather(max(gamma.*max(real(ux).^2+imag(ux).^2+real(uy).^2+imag(uy).^2)));[m
-[32m+[m
-[32m+[m[32mLeff = dphimax/maxPow;[m
-[32m+[m[32malpha_lin = max([alpha_lin.X alpha_lin.Y]);[m
-[32m+[m[32mnl_att_len_ratio = alpha_lin*Leff;[m
-[32m+[m
-[32m+[m[32mif nl_att_len_ratio >= 1[m
-[32m+[m[32m rDZ = dzmax;[m
-[32m+[m[32melse[m
-[32m+[m[32m if alpha_lin == 0[m
-[32m+[m[32m step = Leff;[m
- else[m
-[31m- if alpha_lin == 0[m
-[31m- step = Leff;[m
-[31m- else[m
-[31m- %effective length?[m
-[31m- step = -1/alpha_lin*log(1-nl_att_len_ratio);[m
-[31m- end[m
-[31m- [m
-[31m- rDZ = min([step dzmax]);[m
-[31m- rDZ = max([rDZ dzmin]);[m
-[31m- end [m
-[31m- [m
-[32m+[m[32m %effective length?[m
-[32m+[m[32m step = -1/alpha_lin*log(1-nl_att_len_ratio);[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m rDZ = min([step dzmax]);[m
-[32m+[m[32m rDZ = max([rDZ dzmin]);[m
-[32m+[m[32mend[m
-[32m+[m
- end[m
-\ No newline at end of file[m
-[1mdiff --git a/Classes/02_optical/dp_fiber_lib/lin_step.m b/Classes/02_optical/dp_fiber_lib/lin_step.m[m
-[1mindex eea8a1e..cdb3562 100644[m
-[1m--- a/Classes/02_optical/dp_fiber_lib/lin_step.m[m
-[1m+++ b/Classes/02_optical/dp_fiber_lib/lin_step.m[m
-[36m@@ -22,37 +22,37 @@[m [mn_plates_left = n_plates - n_plates_done;[m
- [m
- % compute last plate size ( if it fits, it should be 0)[m
- if missing_dz > aStepSize[m
-[31m- [m
-[32m+[m
- last_plate = aStepSize;[m
- missing_dz = missing_dz-aStepSize;[m
- plate_sizes = last_plate;[m
- plate_numbers = n_plates;[m
-[31m- [m
-[32m+[m
- else[m
-[31m- [m
-[32m+[m
- last_plate = aStepSize - missing_dz - (n_plates_left-1)*corr_length;[m
-[31m- [m
-[32m+[m
- if missing_dz == 0[m
- missing_dz = [];[m
- end[m
-[31m- [m
-[32m+[m
- %build vector of plate lengths with missing plate part from prev.[m
- %iterartion , then some normal plates and finally a fraction of a plate[m
- %to fit into the step length[m
- plate_sizes = [missing_dz corr_length*ones(1,n_plates_left-1) last_plate];[m
-[31m- [m
-[32m+[m
- if n_plates_done == 0[m
- plate_numbers =[(n_plates_done+1):(n_plates-1) n_plates];[m
- else[m
- plate_numbers = [n_plates_done (n_plates_done+1):(n_plates-1) n_plates]; % not wrking yet[m
- end[m
-[31m- [m
-[31m- %remember for next step [m
-[32m+[m
-[32m+[m[32m %remember for next step[m
- missing_dz = corr_length - last_plate;[m
-[31m- [m
-[32m+[m
- end[m
- [m
-[31m-plate_steps = repmat(n_step,1,length(plate_sizes));[m
-[32m+[m[32mplate_steps = repmat(n_step,1,length(plate_sizes)); %#ok[m
- [m
- %[m
- %figure;stem(plate_sizes);[m
-[36m@@ -66,50 +66,39 @@[m [mtest_plate_numbers = [test_plate_numbers, plate_numbers];[m
- opt_x=fft(opt_x);[m
- opt_y=fft(opt_y);[m
- [m
-[31m-% db1 = gpuArray(brf.db1);[m
-[31m-% db0 = gpuArray(brf.db0);[m
-[31m-% common_beta_x = gpuArray(common_beta_x);[m
-[31m-% common_beta_y = gpuArray(common_beta_y);[m
-[31m-[m
-[31m-db1 = (brf.db1);[m
-[31m-db0 = (brf.db0);[m
-[31m-common_beta_x = (common_beta_x);[m
-[31m-common_beta_y = (common_beta_y);[m
-[32m+[m[32m% Note: db1, db0, common_beta_x, common_beta_y are already on GPU when[m
-[32m+[m[32m% useGPU=true (transferred in CNLSE_plain)[m
-[32m+[m[32mdb1 = brf.db1;[m
-[32m+[m[32mdb0 = brf.db0;[m
- [m
- % process every waveplate with given sizes in plate_sizes[m
- for n=1:length(plate_sizes)[m
- dz = plate_sizes(n);[m
-[31m- [m
-[31m- % figure(87);subplot(2,1,1);plot(real(x(900:1150)));subplot(2,1,2);plot(real(y(900:1150)));[m
-[31m- % MOV1=[MOV1 getframe(87)];[m
-[31m- [m
-[32m+[m
- % extract rotation matrix from pre calculated matrices[m
- matR = brf.matR{plate_numbers(n)};[m
-[31m- [m
-[32m+[m
- % transform to eigenvalue of of fiber segment[m
- tOpt.X = conj(matR(1,1))*opt_x + conj(matR(2,1))*opt_y;[m
- tOpt.Y = conj(matR(1,2))*opt_x + conj(matR(2,2))*opt_y;[m
-[31m- [m
-[32m+[m
- % calculate statistical delta beta for pmd[m
- delta_beta = 0.5*(db1+db0(n))/corr_length;[m
-[31m- % build transfer function with delta beta[m
-[31m- %common.beta = beta1+beta2*omega^2[m
-[31m- [m
-[32m+[m
- %accumulate delta beta for log...[m
- brf.simdgd = brf.simdgd + (db1(length(db1)/2+1)+db0(n))/corr_length;[m
-[31m- [m
-[32m+[m
- h.X = exp(-1j*(common_beta_x-delta_beta)*dz);[m
- h.Y = exp(-1j*(common_beta_y+delta_beta)*dz);[m
-[31m- % delta_beta has to be added to the transfer function[m
-[31m- [m
-[32m+[m
- % process with transfer function[m
- tOpt.X = h.X.*tOpt.X ;[m
- tOpt.Y = h.Y.*tOpt.Y ;[m
-[31m- [m
-[32m+[m
- % rotate back[m
- opt_x = matR(1,1)*tOpt.X + matR(1,2)*tOpt.Y;[m
- opt_y = matR(2,1)*tOpt.X + matR(2,2)*tOpt.Y;[m
-[31m- [m
-[32m+[m
- end[m
- [m
- lin_z_test = lin_z_test + sum(plate_sizes,2);[m
-[36m@@ -117,9 +106,8 @@[m [mlin_z_test = lin_z_test + sum(plate_sizes,2);[m
- %update the number of processed plates so far[m
- n_plates_done = n_plates_done + n_plates_left;[m
- [m
-[31m-% attanuate the signal each linear state with alpha[m
-[31m-% ( 0.2dB = 4.6052e-05 )[m
-[31m-rOpt_x=ifft(exp(-alpha_lin_x*aStepSize/2).*opt_x); % /2 not sure why (have to find it in formulas) [m
-[31m-rOpt_y=ifft(exp(-alpha_lin_y*aStepSize/2).*opt_y); % but not relevant for now[m
-[32m+[m[32m% attenuate the signal each linear step with alpha[m
-[32m+[m[32mrOpt_x=ifft(exp(-alpha_lin_x*aStepSize/2).*opt_x);[m
-[32m+[m[32mrOpt_y=ifft(exp(-alpha_lin_y*aStepSize/2).*opt_y);[m
- [m
-[31m-end[m
-\ No newline at end of file[m
-[32m+[m[32mend[m
-[1mdiff --git a/Classes/04_DSP/Equalizer/EQ.m b/Classes/04_DSP/Equalizer/EQ.m[m
-[1mindex f9d58d2..a03d66b 100644[m
-[1m--- a/Classes/04_DSP/Equalizer/EQ.m[m
-[1m+++ b/Classes/04_DSP/Equalizer/EQ.m[m
-[36m@@ -10,10 +10,6 @@[m [mclassdef EQ < handle[m
- training_length %Number of training symbols[m
- training_loops %Number of loops through sequence for training mode[m
- ideal_dfe %Error free DFE decisions[m
-[31m- weighted_DFE %Weighted DFE on/off[m
-[31m- weighted_DFE_mode %Weighted DFE mode[m
-[31m- weighted_DFE_d_min %d_min threshold parameter for weighted DFE mode 1[m
-[31m- weighted_DFE_I_mode %[a_s, b_s, I_max]-parameters for the weighted DFE[m
- [m
- DB_aim %Aim at duobinary output sequence[m
- [m
-[36m@@ -72,10 +68,6 @@[m [mclassdef EQ < handle[m
- options.training_length = 1024 %Number of training symbols[m
- options.training_loops = 1 %Number of loops through sequence for training mode[m
- options.ideal_dfe = 0 %Error free DFE decisions[m
-[31m- options.weighted_DFE = 0;[m
-[31m- options.weighted_DFE_mode = 'R1';[m
-[31m- options.weighted_DFE_d_min = 0.5;[m
-[31m- options.weighted_DFE_I_mode = [5,0.5,0.6];[m
- [m
- options.DB_aim %Aim at duobinary output sequence[m
- [m
-[36m@@ -446,43 +438,6 @@[m [mclassdef EQ < handle[m
- dd_out(k) = constellation_in_(dd_idx);[m
- end[m
- [m
-[31m- % Implementation of a weighted DFE in[m
-[31m- % order to prevent error propagation.[m
-[31m- % For further details, study [1], chapter 3.2.2 -[m
-[31m- % Modifications of DFE[m
-[31m-[m
-[31m- if obj.weighted_DFE[m
-[31m- % define new constellations[m
-[31m- const = unique(ref_in);[m
-[31m-[m
-[31m- % determine reliability factor gamma_k[m
-[31m- if output_vec(m) > min(const) && output_vec(m) < max(const)[m
-[31m- gamma_k = 1 - abs(output_vec(m) - dd_out(k));[m
-[31m- else[m
-[31m- gamma_k = 1;[m
-[31m- end[m
-[31m-[m
-[31m- % select mode[m
-[31m- if strcmp(obj.weighted_DFE_mode,'R1')[m
-[31m- if gamma_k >= obj.weighted_DFE_d_min[m
-[31m- f_gamma_k = 1;[m
-[31m- else[m
-[31m- f_gamma_k = 0;[m
-[31m- end[m
-[31m- elseif strcmp(obj.weighted_DFE_mode,'R2')[m
-[31m- f_gamma_k = gamma_k;[m
-[31m- elseif strcmp(obj.weighted_DFE_mode,'I1')[m
-[31m- nom = 1-exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1));[m
-[31m- denom = 1+exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1));[m
-[31m- f_gamma_k = (1/2)*((nom/denom) - 1);[m
-[31m- elseif strcmp(obj.weighted_DFE_mode,'I2')[m
-[31m- nom = 1-exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1));[m
-[31m- denom = 1+exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1));[m
-[31m- f_gamma_k = (obj.weighted_DFE_I_mode(3)/2)*((nom/denom) - 1);[m
-[31m- end[m
-[31m- % calculate weighted output[m
-[31m- output_vec(m) = f_gamma_k.*dd_out(k)+(1-f_gamma_k).*output_vec(m);[m
-[31m- end[m
- [m
- if obj.Nb(1) > 0[m
- dd_DFE(2:end) = dd_DFE(1:end-1);[m
-[36m@@ -784,6 +739,3 @@[m [mclassdef EQ < handle[m
- end[m
- end[m
- [m
-[31m-% References[m
-[31m-% [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[m
-[31m-[m
-[1mdiff --git a/Classes/04_DSP/Equalizer/ML_MLSE.m b/Classes/04_DSP/Equalizer/ML_MLSE.m[m
-[1mindex 9965525..168b837 100644[m
-[1m--- a/Classes/04_DSP/Equalizer/ML_MLSE.m[m
-[1m+++ b/Classes/04_DSP/Equalizer/ML_MLSE.m[m
-[36m@@ -597,7 +597,7 @@[m [mclassdef ML_MLSE < handle[m
- obj.S = obj.nSym;[m
- obj.Nf = obj.order * obj.sps;[m
- obj.nStates = obj.S^obj.L;[m
-[31m- obj.nFeasible = obj.nStates * obj.S;[m
-[32m+[m[32m obj.nFeasible = obj.nStates * obj.S; %feasible state transitions[m
- [m
- % --- Trellis mapping[m
- obj.trellis_states = reshape(obj.constellation,1,[]);[m
-[1mdiff --git a/Classes/04_DSP/Timing Recovery/Godard_Timing_Recovery.m b/Classes/04_DSP/Timing Recovery/Godard_Timing_Recovery.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..12eeeaf[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/04_DSP/Timing Recovery/Godard_Timing_Recovery.m[m
-[36m@@ -0,0 +1,112 @@[m
-[32m+[m[32mclassdef Godard_Timing_Recovery < handle[m
-[32m+[m
-[32m+[m[32m properties(Access=public)[m
-[32m+[m[32m mode[m
-[32m+[m[32m num_blocks[m
-[32m+[m[32m fft_length[m
-[32m+[m[32m sps[m
-[32m+[m[32m rolloff[m
-[32m+[m[32m mu[m
-[32m+[m[32m Ki[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m methods(Access=public)[m
-[32m+[m[32m function obj = Godard_Timing_Recovery(options)[m
-[32m+[m[32m arguments(Input)[m
-[32m+[m
-[32m+[m[32m options.mode = 0;[m
-[32m+[m[32m options.num_blocks = 1;[m
-[32m+[m[32m options.fft_length = 1024;[m
-[32m+[m[32m options.sps = 2;[m
-[32m+[m[32m options.rolloff = 0;[m
-[32m+[m[32m options.mu = 0;[m
-[32m+[m[32m options.Ki = 1e-3;[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fn = fieldnames(options);[m
-[32m+[m[32m for n = 1:numel(fn)[m
-[32m+[m[32m obj.(fn{n}) = options.(fn{n});[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m %obj-Initialization here%[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function [data_out, tau_hat] = process(obj, data_in)[m
-[32m+[m
-[32m+[m[32m data_out = data_in;[m
-[32m+[m[32m output_vector = zeros(length(data_in),1);[m
-[32m+[m[32m block_length = length(data_in)/obj.num_blocks;[m
-[32m+[m[32m for i = 1:obj.num_blocks[m
-[32m+[m[32m i_start = ((i-1)*block_length)+1;[m
-[32m+[m[32m i_end = i*block_length;[m
-[32m+[m[32m x = data_in.signal(i_start:i_end);[m
-[32m+[m[32m beta = obj.rolloff;[m
-[32m+[m[32m eta = obj.sps;[m
-[32m+[m[32m R = fft(x,obj.fft_length);[m
-[32m+[m[32m R_full = fft(x);[m
-[32m+[m[41m [m
-[32m+[m[32m if obj.mode == 0 % Classic Godard[m
-[32m+[m[32m % Calculate time shift[m
-[32m+[m[32m k0 = (1:obj.fft_length/2).';[m
-[32m+[m[32m idx1 = k0;[m
-[32m+[m[32m idx2 = k0+(obj.fft_length/2);[m
-[32m+[m[32m tau_hat = sum(imag(R(idx1) .* conj(R(idx2))));[m
-[32m+[m[32m elseif obj.mode == 1 || obj.mode == 2 % Modified Godard 1[m
-[32m+[m[32m % Calculate Shift for the received signal[m
-[32m+[m[32m shiftBins = (1 - 1/eta) * obj.fft_length;[m
-[32m+[m[32m if abs(shiftBins - round(shiftBins)) > 1e-12[m
-[32m+[m[32m disp('Warning: shiftBins=(1-1/eta)*fft_length is non-integer. Choose compatible values for fft_length and eta.');[m
-[32m+[m[32m end[m
-[32m+[m[32m shiftBins = round(shiftBins);[m
-[32m+[m[41m [m
-[32m+[m[32m % Calculate upper and lower bounds[m
-[32m+[m[32m kStart = ((1-beta)/(2*eta)) * obj.fft_length;[m
-[32m+[m[32m kEnd = ((1+beta)/(2*eta)) * obj.fft_length - 1;[m
-[32m+[m[32m if abs(kStart - round(kStart)) > 1e-12 || abs(kEnd - round(kEnd)) > 1e-12[m
-[32m+[m[32m disp('Warning: kStart/kEnd are non-integer. Choose compatible values for fft_length, eta, and beta.');[m
-[32m+[m[32m end[m
-[32m+[m[32m kStart = round(kStart);[m
-[32m+[m[32m kEnd = round(kEnd);[m
-[32m+[m[41m [m
-[32m+[m[32m k0 = (kStart:kEnd).';[m
-[32m+[m[32m idx1 = k0 + 1;[m
-[32m+[m[32m idx2 = mod(k0 + shiftBins, obj.fft_length) + 1;[m
-[32m+[m[41m [m
-[32m+[m[32m % Calculate time shift[m[41m [m
-[32m+[m[32m if obj.mode == 1[m
-[32m+[m[32m tau_hat = sum(imag(R(idx1) .* conj(R(idx2))));[m
-[32m+[m[32m elseif obj.mode == 2[m
-[32m+[m[32m tau_hat = sum(angle(R(idx1))-angle(R(idx2)));[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[41m [m
-[32m+[m[32m % % Normalization[m
-[32m+[m[32m % denom = floor(log10(abs(tau_hat)));[m
-[32m+[m[32m % tau_hat = tau_hat / 10^denom;[m
-[32m+[m
-[32m+[m[32m % Calculate mu using a first-order loop filter[m
-[32m+[m[32m mu_block = obj.mu + obj.Ki * tau_hat;[m
-[32m+[m
-[32m+[m[32m % % Shifting the signal in time domain using interpolation[m
-[32m+[m[32m % x_original = linspace(0,length(x)-1,length(x)).';[m
-[32m+[m[32m % x_new = x_original + mu_block;[m
-[32m+[m[32m % output_vector(i_start:i_end) = interp1(x_original,x,x_new,'linear','extrap');[m
-[32m+[m[41m [m
-[32m+[m[32m % Shifting the signal in frequency domain[m
-[32m+[m[32m k = (0:block_length-1).';[m
-[32m+[m[32m phaseRamp = exp(-1j * 2*pi * (k/block_length) * mu_block);[m
-[32m+[m[32m R_shifted = R_full .* phaseRamp;[m
-[32m+[m
-[32m+[m[32m output_vector(i_start:i_end) = real(ifft(R_shifted));[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32m data_out.signal = output_vector;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[1mdiff --git a/Classes/04_DSP/Timing Recovery/MaxVar_Timing_Recovery.m b/Classes/04_DSP/Timing Recovery/MaxVar_Timing_Recovery.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..d6517d5[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/04_DSP/Timing Recovery/MaxVar_Timing_Recovery.m[m
-[36m@@ -0,0 +1,111 @@[m
-[32m+[m[32mclassdef MaxVar_Timing_Recovery < handle[m
-[32m+[m
-[32m+[m[32m properties(Access=public)[m
-[32m+[m[32m mode[m
-[32m+[m[32m sps[m
-[32m+[m[32m fsym[m
-[32m+[m[32m fadc[m
-[32m+[m[32m num_tau[m
-[32m+[m[32m comp_signal[m
-[32m+[m[32m comp_mode[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m methods(Access=public)[m
-[32m+[m[32m function obj = MaxVar_Timing_Recovery(options)[m
-[32m+[m[32m arguments(Input)[m
-[32m+[m
-[32m+[m[32m options.mode = 0;[m
-[32m+[m[32m options.sps = 2;[m
-[32m+[m[32m options.fsym = 32e9;[m
-[32m+[m[32m options.fadc = 80e9;[m
-[32m+[m[32m options.num_tau = 64;[m
-[32m+[m[32m options.comp_signal = 0;[m
-[32m+[m[32m options.comp_mode = 0;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fn = fieldnames(options);[m
-[32m+[m[32m for n = 1:numel(fn)[m
-[32m+[m[32m obj.(fn{n}) = options.(fn{n});[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m %obj-Initialization here%[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function [data_out] = process(obj, data_in)[m
-[32m+[m
-[32m+[m[32m data_out = data_in;[m
-[32m+[m[32m x = data_in.signal;[m
-[32m+[m
-[32m+[m[32m if obj.comp_mode[m
-[32m+[m[32m our_signal = data_in;[m
-[32m+[m[32m their_signal = obj.comp_signal;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m if obj.mode == 0[m
-[32m+[m[32m vars = zeros(obj.sps,1);[m
-[32m+[m[32m for phi = 1:obj.sps[m
-[32m+[m
-[32m+[m[32m % Test variance for different start samples[m
-[32m+[m[32m y_phi = x(phi:obj.sps:end);[m
-[32m+[m[32m vars(phi) = var(y_phi);[m
-[32m+[m
-[32m+[m[32m % Comparison to reference signal[m
-[32m+[m[32m if obj.comp_mode[m
-[32m+[m[32m our_signal.signal = x(phi:obj.sps:end);[m
-[32m+[m[32m our_signal.fs = 6e9;[m
-[32m+[m[32m our_signal.normalize("mode","rms").plot("displayname",['Our signal, ' num2str(vars(phi))],'fignum',1231+phi);[m
-[32m+[m[32m their_signal.normalize("mode","rms").plot("displayname",'Their signal','fignum',1231+phi);[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m % Choose signal configuration with the maximum variance[m
-[32m+[m[32m [~,phi_opt] = max(vars);[m
-[32m+[m[41m [m
-[32m+[m[32m y = x(phi_opt:obj.sps:end).';[m[41m [m
-[32m+[m
-[32m+[m[32m elseif obj.mode == 1[m
-[32m+[m[32m % Create a grid with different (sub)sample starting points[m
-[32m+[m[32m T = 1/obj.fsym;[m
-[32m+[m[32m t = (0:length(x)-1)/obj.fadc;[m
-[32m+[m[32m tauGrid = linspace(0, T, obj.num_tau);[m
-[32m+[m[41m [m
-[32m+[m[32m % Interpolate the signal starting from every defined point[m
-[32m+[m[32m % and calculate the MMSE/variance[m
-[32m+[m[32m vars = zeros(size(tauGrid));[m
-[32m+[m[32m for i = 1:numel(tauGrid)[m
-[32m+[m[32m tau = tauGrid(i);[m
-[32m+[m[32m % tk = linspace(tau, t(end), length(x)/obj.sps);[m
-[32m+[m[32m tk = tau : T : t(end)+tau;[m
-[32m+[m[32m xk = interp1(t, x, tk, 'linear', 'extrap');[m
-[32m+[m[32m if obj.comp_mode % MMSE[m
-[32m+[m[32m e = xk.' - obj.comp_signal.signal;[m
-[32m+[m[32m vars(i) = mean(abs(e).^2);[m
-[32m+[m[32m else % Variance[m
-[32m+[m[32m vars(i) = var(xk, 1);[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if obj.comp_mode % MMSE[m
-[32m+[m[32m [~,idx] = min(vars);[m
-[32m+[m[32m else % Variance[m
-[32m+[m[32m [~,idx] = max(vars);[m
-[32m+[m[32m end[m
-[32m+[m[32m tau_opt = tauGrid(idx);[m
-[32m+[m[41m [m
-[32m+[m[32m % Choosing the signal at optimum[m
-[32m+[m[32m % tk = linspace(tau_opt, t(end), length(x)/obj.sps);[m
-[32m+[m[32m tk = tau_opt : T : t(end)+tau_opt;[m
-[32m+[m[32m y = interp1(t, x, tk, 'linear', 'extrap');[m
-[32m+[m[32m end[m
-[32m+[m[32m % if length(y) ~= length(x)/obj.sps[m
-[32m+[m[32m % y = [y 0];[m
-[32m+[m[32m % end[m
-[32m+[m[32m data_out.signal = y.';[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[1mdiff --git a/Classes/04_DSP/Timing Recovery/Time_Shifter.m b/Classes/04_DSP/Timing Recovery/Time_Shifter.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..f08e3fe[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/04_DSP/Timing Recovery/Time_Shifter.m[m
-[36m@@ -0,0 +1,39 @@[m
-[32m+[m[32mclassdef Time_Shifter < handle[m
-[32m+[m
-[32m+[m[32m properties(Access=public)[m
-[32m+[m[32m value[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m methods(Access=public)[m
-[32m+[m[32m function obj = Time_Shifter(options)[m
-[32m+[m[32m arguments(Input)[m
-[32m+[m
-[32m+[m[32m options.value = 0;[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fn = fieldnames(options);[m
-[32m+[m[32m for n = 1:numel(fn)[m
-[32m+[m[32m obj.(fn{n}) = options.(fn{n});[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m %obj-Initialization here%[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function [data_out, tau_hat] = process(obj, data_in)[m
-[32m+[m
-[32m+[m[32m data_out = data_in;[m
-[32m+[m[32m x = data_in.signal;[m
-[32m+[m[32m R = fft(x);[m
-[32m+[m[32m k = (0:length(R)-1).';[m
-[32m+[m[32m phaseRamp = exp(-1j * 2*pi * (k/length(R)) * obj.value);[m
-[32m+[m[32m R_shifted = R .* phaseRamp;[m
-[32m+[m[32m data_out.signal = real(ifft(R_shifted));[m
-[32m+[m[41m [m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[1mdiff --git a/Classes/04_DSP/Timing Recovery/Timing_Recovery.m b/Classes/04_DSP/Timing Recovery/Timing_Recovery.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..3999ad7[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/04_DSP/Timing Recovery/Timing_Recovery.m[m
-[36m@@ -0,0 +1,49 @@[m
-[32m+[m[32mclassdef Timing_Recovery < handle[m
-[32m+[m
-[32m+[m[32m properties(Access=public)[m
-[32m+[m[32m modulation[m
-[32m+[m[32m timing_error_detector[m
-[32m+[m[32m sps[m
-[32m+[m[32m damping_factor[m
-[32m+[m[32m normalized_loop_bandwidth[m
-[32m+[m[32m detector_gain[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m methods(Access=public)[m
-[32m+[m[32m function obj = Timing_Recovery(options)[m
-[32m+[m[32m arguments(Input)[m
-[32m+[m
-[32m+[m[32m options.modulation = 'PAM/PSK/QAM';[m
-[32m+[m[32m options.timing_error_detector = 'Gardner (non-data-aided)';[m
-[32m+[m[32m options.sps = 2;[m
-[32m+[m[32m options.damping_factor = 1.0;[m
-[32m+[m[32m options.normalized_loop_bandwidth = 0.01;[m
-[32m+[m[32m options.detector_gain = 2.7;[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fn = fieldnames(options);[m
-[32m+[m[32m for n = 1:numel(fn)[m
-[32m+[m[32m obj.(fn{n}) = options.(fn{n});[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m %obj-Initialization here%[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function [data_out, timing_error] = process(obj, data_in)[m
-[32m+[m
-[32m+[m[32m timing_synchronization = comm.SymbolSynchronizer( ...[m
-[32m+[m[32m "Modulation", obj.modulation,...[m
-[32m+[m[32m "TimingErrorDetector", obj.timing_error_detector, ...[m
-[32m+[m[32m "SamplesPerSymbol", obj.sps, ...[m
-[32m+[m[32m "DampingFactor", obj.damping_factor, ...[m
-[32m+[m[32m "NormalizedLoopBandwidth", obj.normalized_loop_bandwidth, ...[m
-[32m+[m[32m "DetectorGain", obj.detector_gain);[m
-[32m+[m[32m data_out = data_in;[m
-[32m+[m[32m [data_out.signal, timing_error] = timing_synchronization(data_in.signal);[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[1mdiff --git a/Classes/04_DSP/Timing Recovery/Timing_Recovery_GPT.m b/Classes/04_DSP/Timing Recovery/Timing_Recovery_GPT.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..33d0509[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/04_DSP/Timing Recovery/Timing_Recovery_GPT.m[m
-[36m@@ -0,0 +1,77 @@[m
-[32m+[m[32mclassdef Timing_Recovery_GPT < handle[m
-[32m+[m
-[32m+[m[32m properties(Access=public)[m
-[32m+[m[32m sps[m
-[32m+[m[32m muGrid[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m methods(Access=public)[m
-[32m+[m[32m function obj = Timing_Recovery_GPT(options)[m
-[32m+[m[32m arguments(Input)[m
-[32m+[m
-[32m+[m[32m options.sps = 2;[m
-[32m+[m[32m options.muGrid = 0;[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fn = fieldnames(options);[m
-[32m+[m[32m for n = 1:numel(fn)[m
-[32m+[m[32m obj.(fn{n}) = options.(fn{n});[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m %obj-Initialization here%[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function [data_out, mu_best, score] = process(obj, data_in)[m
-[32m+[m[32m %MAXVARTIMINGSYNC Choose sampling phase mu that maximizes variance of downsampled symbols.[m
-[32m+[m[32m %[m
-[32m+[m[32m % data_in : matched-filtered samples (complex or real), length N[m
-[32m+[m[32m % sps : samples per symbol (here typically 2)[m
-[32m+[m[32m % muGrid : candidate fractional offsets in [0,1)[m
-[32m+[m[32m %[m
-[32m+[m[32m % data_out : symbol-rate samples (length floor(N/sps))[m
-[32m+[m[32m % mu_best: chosen fractional offset[m
-[32m+[m[32m % score : variance score for each mu in muGrid[m
-[32m+[m
-[32m+[m[32m data_out = data_in;[m
-[32m+[m[41m [m
-[32m+[m[32m x = data_in.signal(:);[m
-[32m+[m[32m N = length(x);[m
-[32m+[m[32m Ns = floor(N/obj.sps);[m
-[32m+[m[41m [m
-[32m+[m[32m if nargin < 3 || isempty(obj.muGrid)[m
-[32m+[m[32m obj.muGrid = linspace(0, 0.99, 101); % 0..0.99 in ~0.01 steps[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m % Symbol indices (1-based sample positions)[m
-[32m+[m[32m n0 = 1; % start sample index[m
-[32m+[m[32m k = (0:Ns-1).';[m
-[32m+[m[32m tBase = n0 + k*obj.sps; % integer times (1, 1+sps, ...)[m
-[32m+[m[41m [m
-[32m+[m[32m score = zeros(numel(obj.muGrid),1);[m
-[32m+[m[41m [m
-[32m+[m[32m for m = 1:numel(obj.muGrid)[m
-[32m+[m[32m mu = obj.muGrid(m);[m
-[32m+[m[32m t = tBase + mu;[m
-[32m+[m[41m [m
-[32m+[m[32m % Linear fractional sampling[m
-[32m+[m[32m y = interp1(1:N, x, t, 'linear', 'extrap');[m
-[32m+[m[41m [m
-[32m+[m[32m % For PAM, maximize variance of real part (or abs if you prefer)[m
-[32m+[m[32m yr = real(y);[m
-[32m+[m[32m score(m) = var(yr, 1); % use population variance (normalization doesn't matter for argmax)[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m % Pick best mu[m
-[32m+[m[32m [~, idx] = max(score);[m
-[32m+[m[32m mu_best = obj.muGrid(idx);[m
-[32m+[m[41m [m
-[32m+[m[32m % Resample with best mu[m
-[32m+[m[32m t = tBase + mu_best;[m
-[32m+[m[32m data_out.signal = interp1(1:N, x, t, 'linear', 'extrap');[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[1mdiff --git a/Classes/04_DSP/Timing Recovery/Timing_Recovery_Move_It.m b/Classes/04_DSP/Timing Recovery/Timing_Recovery_Move_It.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..bbd0578[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/04_DSP/Timing Recovery/Timing_Recovery_Move_It.m[m
-[36m@@ -0,0 +1,77 @@[m
-[32m+[m[32mclassdef Timing_Recovery_Move_It < handle[m
-[32m+[m
-[32m+[m[32m properties(Access=public)[m
-[32m+[m[32m f_sim[m
-[32m+[m[32m gamma[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m methods(Access=public)[m
-[32m+[m[32m function obj = Timing_Recovery_Move_It(options)[m
-[32m+[m[32m arguments(Input)[m
-[32m+[m
-[32m+[m[32m options.f_sim = 14e9;[m
-[32m+[m[32m options.gamma = 0.1;[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fn = fieldnames(options);[m
-[32m+[m[32m for n = 1:numel(fn)[m
-[32m+[m[32m obj.(fn{n}) = options.(fn{n});[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m %obj-Initialization here%[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function data_out = process(obj, data_in)[m
-[32m+[m
-[32m+[m[32m e = NaN(size(data_in.signal));[m
-[32m+[m[32m T = 1/obj.f_sim;[m
-[32m+[m[32m t = zeros(size(data_in.signal));[m
-[32m+[m[32m t(2) = T/2;[m
-[32m+[m[32m mu = zeros(size(data_in.signal));[m
-[32m+[m
-[32m+[m[32m% n = 2;[m
-[32m+[m[32m for k = 3:2:length(data_in.signal)[m
-[32m+[m[32m data_in.signal(k-1) = data_in.signal(k-1)*(1-mu(k-2)) + data_in.signal(k)*mu(k-2);[m
-[32m+[m[32m data_in.signal(k) = data_in.signal(k)*(1-mu(k-1)) + data_in.signal(k+1)*mu(k-1);[m
-[32m+[m
-[32m+[m[32m % TED[m
-[32m+[m[32m e(k) = (data_in.signal(k-2)-data_in.signal(k))*data_in.signal(k-1);[m[41m [m
-[32m+[m[32m e(k+1) = e(k);[m
-[32m+[m[41m [m
-[32m+[m[32m % TED Mueller Mueller[m
-[32m+[m[32m% e(k) = ref_in(n-1)*data_in.signal(k) - ref_in(n)*data_in.signal(k-2);[m
-[32m+[m[32m% e(k+1) = e(k);[m
-[32m+[m[32m% n = n+1;[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m % interpolator control[m
-[32m+[m[32m% t(k) = t(k-1) + T/2 + obj.gamma/2*e(k);[m
-[32m+[m[32m% t(k+1) = t(k) + T/2 + obj.gamma/2*e(k+1);[m
-[32m+[m[32m t(k) = t(k-1) + T/2 + obj.gamma*e(k)*T/2;[m
-[32m+[m[32m t(k+1) = t(k) + T/2 + obj.gamma*e(k+1)*T/2;[m
-[32m+[m[32m% t(k) = k*T/2 + obj.gamma*e(k)*T/2;[m
-[32m+[m[32m% t(k+1) = k*T/2 + obj.gamma*e(k+1)*T/2;[m
-[32m+[m
-[32m+[m[32m % interpolator[m
-[32m+[m[32m mu(k) = t(k)/(T/2) - round(t(k)/(T/2));[m
-[32m+[m[32m mu(k+1) = t(k+1)/(T/2) - round(t(k+1)/(T/2));[m[41m [m
-[32m+[m[41m [m
-[32m+[m[32m thres = 0.7;[m
-[32m+[m[32m if mu(k)-mu(k-1) > thres[m
-[32m+[m[32m mu(k) = mu(k) - 1;[m
-[32m+[m[32m elseif mu(k) - mu(k-1) < -thres[m
-[32m+[m[32m mu(k) = mu(k) + 1;[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if mu(k+1)-mu(k) > thres[m
-[32m+[m[32m mu(k+1) = mu(k+1) - 1;[m
-[32m+[m[32m elseif mu(k+1) - mu(k) < -thres[m
-[32m+[m[32m mu(k+1) = mu(k+1) + 1;[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[32m data_out = data_in;[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[1mdiff --git a/Classes/04_DSP/Timing_Recovery.m b/Classes/04_DSP/Timing_Recovery.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..23cc331[m
-[1m--- /dev/null[m
-[1m+++ b/Classes/04_DSP/Timing_Recovery.m[m
-[36m@@ -0,0 +1,47 @@[m
-[32m+[m[32mclassdef Timing_Recovery < handle[m
-[32m+[m
-[32m+[m[32m properties(Access=public)[m
-[32m+[m[32m timing_error_detector[m
-[32m+[m[32m sps[m
-[32m+[m[32m damping_factor[m
-[32m+[m[32m normalized_loop_bandwidth[m
-[32m+[m[32m detector_gain[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m methods(Access=public)[m
-[32m+[m[32m function obj = Timing_Recovery(options)[m
-[32m+[m[32m arguments(Input)[m
-[32m+[m
-[32m+[m[32m options.timing_error_detector = 'Gardner';[m
-[32m+[m[32m options.sps = 2;[m
-[32m+[m[32m options.damping_factor = 1.0;[m
-[32m+[m[32m options.normalized_loop_bandwidth = 0.005;[m
-[32m+[m[32m options.detector_gain = 1;[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fn = fieldnames(options);[m
-[32m+[m[32m for n = 1:numel(fn)[m
-[32m+[m[32m obj.(fn{n}) = options.(fn{n});[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[41m [m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function [data_out,timing_error] = process(obj, data_in)[m
-[32m+[m
-[32m+[m[32m timing_synchronization = comm.SymbolSynchronizer( ...[m
-[32m+[m[32m "TimingErrorDetector", obj.timing_error_detector, ...[m
-[32m+[m[32m "SamplesPerSymbol", obj.sps, ...[m
-[32m+[m[32m "DampingFactor", obj.damping_factor, ...[m
-[32m+[m[32m "NormalizedLoopBandwidth", obj.normalized_loop_bandwidth, ...[m
-[32m+[m[32m "DetectorGain", obj.detector_gain);[m
-[32m+[m
-[32m+[m[32m data_out = data_in;[m
-[32m+[m[32m [data_out.signal,timing_error] = timing_synchronization(data_in.signal);[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[1mdiff --git a/Classes/DataBaseHandler/DBHandler.m b/Classes/DataBaseHandler/DBHandler.m[m
-[1mindex 5569746..b7ba026 100644[m
-[1m--- a/Classes/DataBaseHandler/DBHandler.m[m
-[1m+++ b/Classes/DataBaseHandler/DBHandler.m[m
-[36m@@ -23,6 +23,12 @@[m [mclassdef DBHandler < handle[m
- arguments[m
- options.dataBase = ""; % Default value for pathToDB if not provided[m
- options.type = "mysql";[m
-[32m+[m[32m options.server = "";[m
-[32m+[m[32m options.port = 3306;[m
-[32m+[m[32m options.user = "";[m
-[32m+[m[32m options.password = "";[m
-[32m+[m[41m [m
-[32m+[m
- end[m
- [m
- % Assign values to class properties based on input arguments[m
-[36m@@ -46,12 +52,13 @@[m [mclassdef DBHandler < handle[m
- [m
- obj.conn = database( ...[m
- string(obj.dataBase), ... % Database name[m
-[31m- "silas", ... % Username[m
-[31m- "silas", ... % Password (or getSecret)[m
-[32m+[m[32m options.user, ... % Username[m
-[32m+[m[32m options.password, ... % Password (or getSecret)[m
- "Vendor", "MySQL", ...[m
-[31m- "Server", "134.245.243.254", ...[m
-[32m+[m[32m "Server", options.server, ...[m
- "PortNumber", 3306, ...[m
- "JDBCDriverLocation", "C:\Users\Silas\Documents\mysql-connector-j-9.3.0\mysql-connector-j-9.3.0.jar");[m
-[32m+[m[41m [m
- end[m
- [m
- catch e[m
-[1mdiff --git a/Functions/EQ_structures/ml_mlse.m b/Functions/EQ_structures/ml_mlse.m[m
-[1mindex 84ff5cb..04fe317 100644[m
-[1m--- a/Functions/EQ_structures/ml_mlse.m[m
-[1m+++ b/Functions/EQ_structures/ml_mlse.m[m
-[36m@@ -54,12 +54,6 @@[m [mfor k = 1:numel(fn)[m
- end[m
- json_str = jsonencode(eq_small);[m
- [m
-[31m-fn = fieldnames(eq_);[m
-[31m-for k = 1:numel(fn)[m
-[31m- if issparse(eq_.(fn{k}))[m
-[31m- eq_.(fn{k}) = full(eq_.(fn{k}));[m
-[31m- end[m
-[31m-end[m
- ml_mlse_results.config.eq = jsonencode(eq_);[m
- ml_mlse_results.config.equalizer_structure = int32(equalizer_structure.ml_mlse);[m
- ml_mlse_results.config.comment = 'function: ML-based MLSE';[m
-[36m@@ -93,7 +87,6 @@[m [mend[m
- function [bits, errors, ber, error_pos, errors_precoded, ber_precoded] = calculateBER(eq_signal_hd, tx_symbols, tx_bits, precode_mode, M, eth_style)[m
- % Calculate BER based on precoding mode[m
- mapper = PAMmapper(M, 0, "eth_style", eth_style);[m
-[31m-skip_front = 150;[m
- [m
- switch precode_mode[m
- case db_mode.no_db[m
-[36m@@ -108,11 +101,11 @@[m [mswitch precode_mode[m
- tx_bits_precoded = mapper.demap(tx_symbols_precoded);[m
- [m
- rx_bits = mapper.demap(eq_signal_hd_precoded);[m
-[31m- [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits.signal, tx_bits_precoded.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1);[m
-[32m+[m[32m [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits.signal, tx_bits_precoded.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1);[m
- [m
- % B) Just determine BER[m
- rx_bits = mapper.demap(eq_signal_hd);[m
-[31m- [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1);[m
-[32m+[m[32m [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1);[m
- [m
- case db_mode.db_precoded[m
- % Data is precoded on TX side[m
-[36m@@ -120,12 +113,12 @@[m [mswitch precode_mode[m
- eq_signal_hd_decoded = Duobinary().encode(eq_signal_hd, "M", M);[m
- eq_signal_hd_decoded = Duobinary().decode(eq_signal_hd_decoded, "M", M);[m
- rx_bits_decoded = mapper.demap(eq_signal_hd_decoded);[m
-[31m- [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits_decoded.signal, tx_bits.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1);[m
-[32m+[m[32m [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits_decoded.signal, tx_bits.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1);[m
- [m
- % B) Omit the Coding by comparing with demapped TX symbol sequence[m
- tx_bits_demapped = mapper.demap(tx_symbols);[m
- rx_bits = mapper.demap(eq_signal_hd);[m
-[31m- [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits_demapped.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1);[m
-[32m+[m[32m [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits_demapped.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1);[m
- end[m
- end[m
- [m
-[1mdiff --git a/Functions/Theory/Dissertation/mach_zehnder_modulator.m b/Functions/Theory/Dissertation/mach_zehnder_modulator.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..f9eca58[m
-[1m--- /dev/null[m
-[1m+++ b/Functions/Theory/Dissertation/mach_zehnder_modulator.m[m
-[36m@@ -0,0 +1,219 @@[m
-[32m+[m
-[32m+[m
-[32m+[m[32m% Parameters[m
-[32m+[m[32mc0 = physconst('lightspeed'); % [m/s][m
-[32m+[m[32mlambda0 = 1310e-9; % [m][m
-[32m+[m[32momega0 = 2*pi*c0/lambda0;[m
-[32m+[m
-[32m+[m[32mL = 5e-3; % [m] effective phase section length (set as needed)[m
-[32m+[m[32mn_eff = 2.2; % [-] effective index (set as needed)[m
-[32m+[m
-[32m+[m[32mE0 = 1; % field amplitude (arbitrary)[m
-[32m+[m[32mVpi = 3.2; % [V] half-wave voltage (your V_pi)[m
-[32m+[m
-[32m+[m[32m% Drive[m
-[32m+[m[32mf0 = 1e9; % [Hz][m
-[32m+[m[32mfs = 200e9; % [Hz][m
-[32m+[m[32mNper = 2; % number of periods[m
-[32m+[m[32mVpp = 0.6*Vpi; % [V] peak-to-peak of v_drive(t)[m
-[32m+[m
-[32m+[m[32mbiasV = 1.1; % [V] differential bias added to v_drive[m
-[32m+[m
-[32m+[m[32m% Time axis + differential drive voltage v_drive(t)[m
-[32m+[m[32mT = Nper/f0;[m
-[32m+[m[32mt = (0:1/fs:T-1/fs).';[m
-[32m+[m
-[32m+[m
-[32m+[m[32mif 1[m
-[32m+[m[32m % SINE[m
-[32m+[m[32m v_drive = biasV + (Vpp/2)*sin(2*pi*f0*t); % v_drive(t) (peak = Vpp/2)[m
-[32m+[m
-[32m+[m[32melse[m
-[32m+[m
-[32m+[m[32m % --- Generate PAM-4 Sequence ---[m
-[32m+[m[32m symbols = linspace(-0.5, 0.5, 4);[m
-[32m+[m[32m num_symbols = 12; % Increased slightly for better visual[m
-[32m+[m[32m rng(44);[m
-[32m+[m[32m random_data = symbols(randi(4, 1, num_symbols));[m
-[32m+[m
-[32m+[m[32m % Create time axis (Note: T is your period from the sine code)[m
-[32m+[m[32m sps = round(T * fs);[m
-[32m+[m[32m t = (0:1/fs:(num_symbols*T)-1/fs).';[m
-[32m+[m
-[32m+[m[32m % Upsample to rectangular waveform[m
-[32m+[m[32m v_pam = repelem(random_data, sps).';[m
-[32m+[m
-[32m+[m[32m % Apply swing and bias: Resulting range is [biasV-Vpp/2, biasV+Vpp/2][m
-[32m+[m[32m v_drive_rect = biasV + (v_pam * Vpp);[m
-[32m+[m
-[32m+[m[32m % --- Round the edges ---[m
-[32m+[m[32m filter_span = round(sps/1.5); % Increased span for smoother "rounding"[m
-[32m+[m[32m window = gausswin(filter_span);[m
-[32m+[m[32m window = window / sum(window);[m
-[32m+[m
-[32m+[m[32m % Apply filter (using 'same' to keep vector length, but be aware of edge transients)[m
-[32m+[m[32m v_drive = conv(v_drive_rect, window, 'same');[m
-[32m+[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m
-[32m+[m[32m% Analytic[m
-[32m+[m[32mv_ = linspace(-1,2, 2001);[m
-[32m+[m[32m% Field transfer function (amplitude)[m
-[32m+[m[32mField_mzm_analytic = cos((pi/2)*v_);[m
-[32m+[m
-[32m+[m[32m% Power transfer function (intensity)[m
-[32m+[m[32mP_mzm_analytic = Field_mzm_analytic.^2;[m
-[32m+[m
-[32m+[m[32m% Imbalance factor in YOUR notation:[m
-[32m+[m[32mrho = 1;[m[41m [m
-[32m+[m
-[32m+[m[32m% Push-pull branch voltages (consistent with v_drive = v1 - v2)[m
-[32m+[m[32mv1 = +0.5*v_drive; % arm 1[m
-[32m+[m[32mv2 = -0.5*v_drive; % arm 2[m
-[32m+[m
-[32m+[m[32m% Phases phi1, phi2[m
-[32m+[m[32mphi1 = pi * v1 / Vpi;[m
-[32m+[m[32mphi2 = pi * v2 / Vpi;[m
-[32m+[m
-[32m+[m[32m% Fields: E_in and E_out (exactly your Eq. (mzm_e_field))[m
-[32m+[m[32mE_in = E0 .* exp(1i*omega0*t);[m
-[32m+[m
-[32m+[m[32mcommon_phase = exp(-1i * (omega0*L*n_eff/c0)); % exp(-j*omega0*L*n_eff/c0)[m
-[32m+[m
-[32m+[m[32mE_out = E0 .* exp(1i*omega0*t) .* common_phase .* 0.5 .* ...[m
-[32m+[m[32m ( exp(-1i*phi1) + rho .* exp(-1i*phi2) );[m
-[32m+[m
-[32m+[m[32m% Transfer function (numerical): E_out/E_in[m
-[32m+[m[32mH_num = E_out ./ E_in;[m
-[32m+[m
-[32m+[m[32m% Power (normalized)[m
-[32m+[m[32mPnorm_num = abs(H_num).^2; % since |E_out/E_in|^2[m
-[32m+[m
-[32m+[m[32m% Ideal TF (analytic) for comparison (rho=1, push-pull)[m
-[32m+[m[32mH_ideal = common_phase .* cos( (pi/2) * (v_drive./Vpi) );[m
-[32m+[m
-[32m+[m[32mPnorm_ideal = abs(H_ideal).^2;[m
-[32m+[m[32mPnorm_math = cos( (pi/2) * (v_drive./Vpi) ).^2;[m
-[32m+[m
-[32m+[m
-[32m+[m[32mset(groot, 'defaultLegendInterpreter', 'tex');[m
-[32m+[m[32mset(groot, 'defaultAxesTickLabelInterpreter', 'tex');[m
-[32m+[m[32mset(groot, 'defaultTextInterpreter', 'tex');[m
-[32m+[m
-[32m+[m[32m% Normalized voltage axis (multiples of Vpi)[m
-[32m+[m[32mv_norm = v_drive./Vpi;[m
-[32m+[m
-[32m+[m[32mcolfield = [0,0,0]; %is black[m
-[32m+[m[32mcolpow = linspecer(2);[m
-[32m+[m[32mcolpow = colpow(1,:);[m
-[32m+[m[32mcolvdrive = linspecer(2);[m
-[32m+[m[32mcolvdrive = colvdrive(2,:);[m
-[32m+[m
-[32m+[m[32m%% SIGNAL IN[m
-[32m+[m[32mfigure(1); clf[m
-[32m+[m[32mplot(v_norm,t*1e9, 'LineWidth', 1.0,'Color',colvdrive); grid on;[m
-[32m+[m[32mylabel('t [ns]'); xlabel('v_{drive}(t)/V_\pi');[m[41m [m
-[32m+[m[32mtitle('Drive voltage (normalized)');[m
-[32m+[m[32mxlim([min(v_) max(v_)]);[m
-[32m+[m[32m% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\linear_casee\mzm_input_signal.tex');[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%% IN/OUT (static transfer) — normalized x-axis + analytic curve[m
-[32m+[m[32mif 0[m
-[32m+[m[32mfigure(2); clf[m
-[32m+[m[32mplot(v_, Field_mzm_analytic, 'LineWidth', 1.2,'LineStyle','--','Color',colfield); hold on;% analytic power TF[m
-[32m+[m[32mplot(v_, P_mzm_analytic, 'LineWidth', 1.2, 'Color',colpow); hold on;% analytic power TF[m
-[32m+[m[32m% show input time signal[m
-[32m+[m[32mplot(v_norm,-1+t*1e9, 'LineWidth', 1.0,'Color',colvdrive); grid on;[m
-[32m+[m[32m% show output time signal[m
-[32m+[m[32mplot(2+t*1e9, Pnorm_num, 'LineWidth', 1.0,'DisplayName','Intensity', 'Color',colvdrive); hold on;[m
-[32m+[m[32mplot(2+t*1e9, real(H_ideal), '--', 'LineWidth', 1.0,'DisplayName','Field','Color',colfield); hold on;[m
-[32m+[m[32mscatter(v_norm, Pnorm_num, 12, '.', 'LineWidth', 1,'MarkerEdgeColor',colvdrive);[m[41m [m
-[32m+[m[32mscatter(biasV./Vpi,(cos((pi/2)*biasV./Vpi)^2),10,'Marker','o');[m
-[32m+[m[32mline([min(v_drive), min(v_drive)]./Vpi,[(cos((pi/2)*min(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--');[m
-[32m+[m[32mline([max(v_drive) max(v_drive)]./Vpi,[(cos((pi/2)*max(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--');[m
-[32m+[m[32mxline([min(v_norm) max(v_norm)])[m
-[32m+[m
-[32m+[m[32mgrid on;[m
-[32m+[m[32mxlabel('v_{drive}(t)/V_\pi'); ylabel('|E_{out}/E_{in}|^2');[m
-[32m+[m[32m% legend[m
-[32m+[m[32mxlim([min(v_) max(v_)+1]);[m
-[32m+[m[32mylim([-1 1]);[m
-[32m+[m
-[32m+[m[32m% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\mzm.tex');[m
-[32m+[m[32mend[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32mfigure(3); clf[m
-[32m+[m[32mplot(v_, Field_mzm_analytic, 'LineWidth', 1.2,'LineStyle','--','Color',colfield); hold on;% analytic power TF[m
-[32m+[m[32mplot(v_, P_mzm_analytic, 'LineWidth', 1.2, 'Color',colpow); hold on;% analytic power TF[m
-[32m+[m
-[32m+[m[32mscatter(v_norm, Pnorm_num, 12, '.', 'LineWidth', 1,'MarkerEdgeColor',colvdrive);[m[41m [m
-[32m+[m[32mscatter(biasV./Vpi,(cos((pi/2)*biasV./Vpi)^2),10,'Marker','o');[m
-[32m+[m[32mline([min(v_drive), min(v_drive)]./Vpi,[(cos((pi/2)*min(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--');[m
-[32m+[m[32mline([max(v_drive) max(v_drive)]./Vpi,[(cos((pi/2)*max(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--');[m
-[32m+[m[32mxline([min(v_norm) max(v_norm)])[m
-[32m+[m
-[32m+[m[32mgrid on;[m
-[32m+[m[32mxlabel('v_{drive}(t)/V_\pi'); ylabel('|E_{out}/E_{in}|^2');[m
-[32m+[m[32m% legend[m
-[32m+[m[32mxlim([min(v_) max(v_)]);[m
-[32m+[m[32mylim([-1 1]);[m
-[32m+[m
-[32m+[m[32m% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\mzm_tramsfer_function_matlab.tex');[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%[m[41m [m
-[32m+[m
-[32m+[m[32mfigure(4); clf[m
-[32m+[m[32m% plot(v_, Field_mzm_analytic, 'LineWidth', 1.2,'LineStyle','--','Color',colfield); hold on;% analytic power TF[m
-[32m+[m[32mplot(v_, P_mzm_analytic, 'LineWidth', 1.2, 'Color','black'); hold on;% analytic power TF[m
-[32m+[m[32minput_dots = linspace(min(v_drive),max(v_drive),4)./Vpi;[m
-[32m+[m[32m% input_dots = unique(v_drive_rect)./Vpi;[m
-[32m+[m[32moutput_dots = (cos((pi/2)*input_dots).^2);[m
-[32m+[m[32mscatter(input_dots,output_dots,'Marker','x','LineWidth',1,'MarkerEdgeColor','black');[m
-[32m+[m[32mscatter(input_dots,zeros(size(input_dots)),'Marker','^','LineWidth',2,'MarkerEdgeColor','black');[m
-[32m+[m[32m% scatter(ones(size(input_dots)),output_dots,'Marker','<','LineWidth',2,'MarkerEdgeColor','black');[m
-[32m+[m
-[32m+[m[32mfor i = 1:numel(input_dots)[m
-[32m+[m[32m % Draw the dashed projection lines[m
-[32m+[m[32m line([input_dots(i), input_dots(i)], [output_dots(i), 0], 'linewidth', 0.5, 'color', 'black', 'linestyle', '--', 'handlevisibility', 'off');[m
-[32m+[m[32m line([input_dots(i), 1], [output_dots(i), output_dots(i)], 'linewidth', 0.5, 'color', 'black', 'linestyle', '--', 'handlevisibility', 'off');[m
-[32m+[m[41m [m
-[32m+[m[32m % Add the level annotation boxes near the output (y-axis)[m
-[32m+[m[32m % Adjust the '1.05' to move the box further right or 'output_dots(i)' for height[m
-[32m+[m[32m j = 3-(i-1)*2;[m
-[32m+[m[32m text(1, output_dots(i), sprintf('Level %d', j), ...[m
-[32m+[m[32m 'FontSize', 8, ...[m
-[32m+[m[32m 'EdgeColor', 'black', ...[m
-[32m+[m[32m 'BackgroundColor', 'white', ...[m
-[32m+[m[32m 'Margin', 2);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mxlim([0,1.5]);[m
-[32m+[m[32mylim([0,1])[m
-[32m+[m
-[32m+[m[32m% line([min(v_drive), min(v_drive)]./Vpi,[(cos((pi/2)*min(v_drive)./Vpi)^2), 0],'linewidth',0.5,'color','black','linestyle','--');[m
-[32m+[m[32m% line([max(v_drive), max(v_drive)]./Vpi,[(cos((pi/2)*max(v_drive)./Vpi)^2), 0],'linewidth',0.5,'color','black','linestyle','--');[m
-[32m+[m
-[32m+[m[32m% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\linear_casee\mzm_tf.tex');[m
-[32m+[m[32m% xticks(sort(input_dots));[m
-[32m+[m[32m% yticks(sort(output_dots));[m
-[32m+[m[32mgrid off[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%[m[41m [m
-[32m+[m[32m% % FIELD TF (only field here; do not mix power into this figure)[m
-[32m+[m[32mfigure(5); clf[m
-[32m+[m[32m% plot(t*1e9, real(H_num), 'LineWidth', 1.0); hold on;[m
-[32m+[m[32m% plot(t*1e9, real(H_ideal), '--', 'LineWidth', 1.0,'DisplayName','Field','Color',colfield); hold on;[m
-[32m+[m[32mplot(t*1e9, Pnorm_num, 'LineWidth', 1.0,'DisplayName','Intensity', 'Color',colpow); hold on;[m
-[32m+[m[32mgrid on;[m
-[32m+[m[32mxlabel('t [ns]'); ylabel('Re\{E_{out}/E_{in}\}');[m
-[32m+[m[32mlegend[m
-[32m+[m[32myticks(sort(output_dots));[m
-[32m+[m[32m% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\linear_casee\mzm_output_signal.tex');[m
-[32m+[m
-[32m+[m
-[32m+[m
-[1mdiff --git a/Functions/mat2tikz_improved.m b/Functions/mat2tikz_improved.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..a36b1d1[m
-[1m--- /dev/null[m
-[1m+++ b/Functions/mat2tikz_improved.m[m
-[36m@@ -0,0 +1,23 @@[m
-[32m+[m[32mfunction mat2tikz_improved(filename)[m
-[32m+[m[32marguments[m
-[32m+[m[32m % Default to the path in your example if no argument is provided[m
-[32m+[m[32m filename (1,1) string = 'C:\Users\Silas\Documents\Dissertation\00_Examples\tikz\textfig.tikz';[m
-[32m+[m[32mend[m
-[32m+[m[32mcleanfigure;[m
-[32m+[m[32mmatlab2tikz(char(filename), ...[m
-[32m+[m[32m 'width','\fwidth', ...[m
-[32m+[m[32m 'height','\fheight', ...[m
-[32m+[m[32m 'showInfo',false, ...[m
-[32m+[m[32m 'extraAxisOptions',{ ...[m
-[32m+[m[32m 'legend style={font=\footnotesize}', ...[m
-[32m+[m[32m 'xlabel style={font=\color{white!15!black},font=\small},',...[m
-[32m+[m[32m 'ylabel style={font=\color{white!15!black},font=\small},',...[m
-[32m+[m[32m 'legend columns=1', ...[m
-[32m+[m[32m 'every axis/.append style={font=\scriptsize}',...[m
-[32m+[m[32m 'legend columns=1',...[m
-[32m+[m[32m '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}',...[m
-[32m+[m[32m '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}',...[m
-[32m+[m[32m 'every axis/.append style={font=\scriptsize}',...[m
-[32m+[m[32m });[m
-[32m+[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --git a/Libs/wesanderson_colors/WesPalette.m b/Libs/wesanderson_colors/WesPalette.m[m
-[1mindex 7cd1dcb..13e976f 100644[m
-[1m--- a/Libs/wesanderson_colors/WesPalette.m[m
-[1m+++ b/Libs/wesanderson_colors/WesPalette.m[m
-[36m@@ -1,10 +1,13 @@[m
- classdef WesPalette[m
- % WESPALETTE Wes Anderson color palettes with auto-completion[m
- % Usage:[m
-[31m- % cmap = WesPalette.Zissou1.rgb()[m
-[31m- % cmap = WesPalette.Zissou1.rgb(3)[m
-[31m-[m
-[31m- % https://github.com/karthik/wesanderson?tab=readme-ov-file[m
-[32m+[m[32m % cmap = WesPalette.Zissou1.rgb() % full palette[m
-[32m+[m[32m % cmap = WesPalette.Zissou1.rgb(3) % 3 colors (discrete default)[m
-[32m+[m[32m % cmap = WesPalette.Zissou1.rgb(12,"discrete") % any n, no interpolation[m
-[32m+[m[32m % cmap = WesPalette.Zissou1.rgb(256,"continuous") % smooth colormap (Lab interpolation)[m
-[32m+[m[32m %[m
-[32m+[m[32m % Requires:[m
-[32m+[m[32m % - colorspace.m (Pascal Getreuer) on MATLAB path for "continuous" mode[m
- [m
- enumeration[m
- BottleRocket1[m
-[36m@@ -34,21 +37,33 @@[m [mclassdef WesPalette[m
- end[m
- [m
- methods[m
-[31m- function cmap = rgb(obj, n)[m
-[32m+[m[32m function cmap = rgb(obj, n, mode)[m
- % Return palette as Nx3 RGB colormap [0–1][m
-[32m+[m[32m %[m
-[32m+[m[32m % n : number of requested colors (optional)[m
-[32m+[m[32m % mode : "discrete" (default) or "continuous"[m
- [m
-[31m- hex = obj.hex();[m
-[32m+[m[32m base_hex = obj.hex();[m
-[32m+[m[32m base_rgb = WesPalette.hex2rgb(base_hex);[m
- [m
-[31m- rgb = hex2rgb(hex);[m
-[32m+[m[32m if nargin < 2 || isempty(n)[m
-[32m+[m[32m cmap = base_rgb;[m
-[32m+[m[32m return;[m
-[32m+[m[32m end[m
-[32m+[m[32m if nargin < 3 || isempty(mode)[m
-[32m+[m[32m mode = "discrete";[m
-[32m+[m[32m end[m
-[32m+[m[32m mode = lower(string(mode));[m
- [m
-[31m- if nargin == 2[m
-[31m- if n > size(rgb,1)[m
-[31m- error('Requested %d colors, but only %d available.', ...[m
-[31m- n, size(rgb,1))[m
-[31m- end[m
-[31m- cmap = rgb(1:n,:);[m
-[32m+[m[32m validateattributes(n, {'numeric'}, {'scalar','integer','positive'}, mfilename, 'n');[m
-[32m+[m[32m if mode ~= "discrete" && mode ~= "continuous"[m
-[32m+[m[32m error('mode must be "discrete" or "continuous".');[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m if mode == "discrete"[m
-[32m+[m[32m cmap = WesPalette.sample_discrete(base_rgb, n);[m
- else[m
-[31m- cmap = rgb;[m
-[32m+[m[32m cmap = WesPalette.interpolate_continuous_lab(base_rgb, n);[m
- end[m
- end[m
- end[m
-[36m@@ -56,78 +71,116 @@[m [mclassdef WesPalette[m
- methods (Access = private)[m
- function hex = hex(obj)[m
- % Internal HEX storage[m
-[31m-[m
- switch obj[m
- case WesPalette.BottleRocket1[m
- hex = {'#A42820','#5F5647','#9B110E','#3F5151','#4E2A1E','#550307','#0C1707'};[m
-[31m-[m
- case WesPalette.BottleRocket2[m
- hex = {'#FAD510','#CB2314','#273046','#354823','#1E1E1E'};[m
-[31m-[m
- case {WesPalette.Rushmore1, WesPalette.Rushmore}[m
- hex = {'#E1BD6D','#EABE94','#0B775E','#35274A','#F2300F'};[m
-[31m-[m
- case WesPalette.Royal1[m
- hex = {'#899DA4','#C93312','#FAEFD1','#DC863B'};[m
-[31m-[m
- case WesPalette.Royal2[m
- hex = {'#9A8822','#F5CDB4','#F8AFA8','#FDDDA0','#74A089'};[m
-[31m-[m
- case WesPalette.Zissou1[m
- hex = {'#3B9AB2','#78B7C5','#EBCC2A','#E1AF00','#F21A00'};[m
-[31m-[m
- case WesPalette.Zissou1Continuous[m
- hex = {'#3A9AB2','#6FB2C1','#91BAB6','#A5C2A3','#BDC881', ...[m
- '#DCCB4E','#E3B710','#E79805','#EC7A05','#EF5703','#F11B00'};[m
-[31m-[m
- case WesPalette.Darjeeling1[m
- hex = {'#FF0000','#00A08A','#F2AD00','#F98400','#5BBCD6'};[m
-[31m-[m
- case WesPalette.Darjeeling2[m
- hex = {'#ECCBAE','#046C9A','#D69C4E','#ABDDDE','#000000'};[m
-[31m-[m
- case WesPalette.Chevalier1[m
- hex = {'#446455','#FDD262','#D3DDDC','#C7B19C'};[m
-[31m-[m
- case WesPalette.FantasticFox1[m
- hex = {'#DD8D29','#E2D200','#46ACC8','#E58601','#B40F20'};[m
-[31m-[m
- case WesPalette.Moonrise1[m
- hex = {'#F3DF6C','#CEAB07','#D5D5D3','#24281A'};[m
-[31m-[m
- case WesPalette.Moonrise2[m
- hex = {'#798E87','#C27D38','#CCC591','#29211F'};[m
-[31m-[m
- case WesPalette.Moonrise3[m
- hex = {'#85D4E3','#F4B5BD','#9C964A','#CDC08C','#FAD77B'};[m
-[31m-[m
- case WesPalette.Cavalcanti1[m
- hex = {'#D8B70A','#02401B','#A2A475','#81A88D','#972D15'};[m
-[31m-[m
- case WesPalette.GrandBudapest1[m
- hex = {'#F1BB7B','#FD6467','#5B1A18','#D67236'};[m
-[31m-[m
- case WesPalette.GrandBudapest2[m
- hex = {'#E6A0C4','#C6CDF7','#D8A499','#7294D4'};[m
-[31m-[m
- case WesPalette.IsleofDogs1[m
- hex = {'#9986A5','#79402E','#CCBA72','#0F0D0E','#D9D0D3','#8D8680'};[m
-[31m-[m
- case WesPalette.IsleofDogs2[m
- hex = {'#EAD3BF','#AA9486','#B6854D','#39312F','#1C1718'};[m
-[31m-[m
- case WesPalette.FrenchDispatch[m
- hex = {'#90D4CC','#BD3027','#B0AFA2','#7FC0C6','#9D9C85'};[m
-[31m-[m
- case WesPalette.AsteroidCity1[m
- hex = {'#0A9F9D','#CEB175','#E54E21','#6C8645','#C18748'};[m
-[31m-[m
- case WesPalette.AsteroidCity2[m
- hex = {'#C52E19','#AC9765','#54D8B1','#B67C3B','#175149','#AF4E24'};[m
-[31m-[m
- case WesPalette.AsteroidCity3[m
- hex = {'#FBA72A','#D3D4D8','#CB7A5C','#5785C1'};[m
- end[m
- end[m
- end[m
-[32m+[m
-[32m+[m[32m methods (Static, Access = private)[m
-[32m+[m[32m function rgb = hex2rgb(hex)[m
-[32m+[m[32m % hex: cellstr like {'#RRGGBB', ...}[m
-[32m+[m[32m if isstring(hex), hex = cellstr(hex); end[m
-[32m+[m[32m n = numel(hex);[m
-[32m+[m[32m rgb = zeros(n,3);[m
-[32m+[m[32m for i = 1:n[m
-[32m+[m[32m h = char(hex{i});[m
-[32m+[m[32m if startsWith(h,'#'), h = h(2:end); end[m
-[32m+[m[32m if numel(h) ~= 6[m
-[32m+[m[32m error('Invalid HEX color: %s', hex{i});[m
-[32m+[m[32m end[m
-[32m+[m[32m rgb(i,1) = hex2dec(h(1:2))/255;[m
-[32m+[m[32m rgb(i,2) = hex2dec(h(3:4))/255;[m
-[32m+[m[32m rgb(i,3) = hex2dec(h(5:6))/255;[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function cmap = sample_discrete(base_rgb, n)[m
-[32m+[m[32m % No interpolation; allow any n by sampling/repeating.[m
-[32m+[m[32m k = size(base_rgb,1);[m
-[32m+[m
-[32m+[m[32m if n <= k[m
-[32m+[m[32m idx = round(linspace(1, k, n)); % spread across palette[m
-[32m+[m[32m idx = max(1, min(k, idx));[m
-[32m+[m[32m cmap = base_rgb(idx,:);[m
-[32m+[m[32m else[m
-[32m+[m[32m reps = floor(n / k);[m
-[32m+[m[32m rmd = mod(n, k);[m
-[32m+[m[32m cmap = [repmat(base_rgb, reps, 1); base_rgb(1:rmd,:)];[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m function cmap = interpolate_continuous_lab(base_rgb, n)[m
-[32m+[m[32m % Smooth interpolation in Lab using colorspace().[m
-[32m+[m[32m % Requires colorspace.m by Pascal Getreuer on MATLAB path.[m
-[32m+[m
-[32m+[m[32m k = size(base_rgb,1);[m
-[32m+[m[32m if k == 1[m
-[32m+[m[32m cmap = repmat(base_rgb, n, 1);[m
-[32m+[m[32m return;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m % Convert to Lab, interpolate each channel, convert back[m
-[32m+[m[32m lab = colorspace('Lab<-RGB', base_rgb);[m
-[32m+[m
-[32m+[m[32m t_base = linspace(0, 1, k);[m
-[32m+[m[32m t_new = linspace(0, 1, n);[m
-[32m+[m
-[32m+[m[32m lab_new = zeros(n,3);[m
-[32m+[m[32m for c = 1:3[m
-[32m+[m[32m lab_new(:,c) = interp1(t_base, lab(:,c), t_new, 'linear');[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m rgb_new = colorspace('RGB<-Lab', lab_new);[m
-[32m+[m
-[32m+[m[32m % Clamp to displayable gamut[m
-[32m+[m[32m cmap = min(max(rgb_new, 0), 1);[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
- end[m
-[1mdiff --git a/Libs/wesanderson_colors/minimal_example_wespalette.m b/Libs/wesanderson_colors/minimal_example_wespalette.m[m
-[1mindex 9fcd99b..f308f27 100644[m
-[1m--- a/Libs/wesanderson_colors/minimal_example_wespalette.m[m
-[1m+++ b/Libs/wesanderson_colors/minimal_example_wespalette.m[m
-[36m@@ -5,8 +5,8 @@[m [my2 = 1e0 ./ (1 + exp(-0.4*(x-12))); % NLPN[m
- y3 = 1e-6 * 10.^(0.45*x); % RP on gamma[m
- y4 = 1e-2 * 10.^(0.18*(x-8)); % RP on beta2[m
- [m
-[31m-cmap = WesPalette.AsteroidCity1.rgb(4);[m
-[31m-cmap = linspecer(4);[m
-[32m+[m[32mcmap = WesPalette.AsteroidCity1;[m
-[32m+[m[32m% cmap = linspecer(4);[m
- figure1=figure(202998);clf;hold on[m
- lw = 0.8; ms = 4;[m
- plot(x,y1,'LineWidth',lw,'Color',cmap(1,:),'Marker','o','MarkerEdgeColor',cmap(1,:),'MarkerFaceColor',[1,1,1],'MarkerSize',ms); [m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_FFE_DFE.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_FFE_DFE.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..29069ce[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_FFE_DFE.m[m
-[36m@@ -0,0 +1,36 @@[m
-[32m+[m[32mtaps_ffe = [200, 3, 2];[m
-[32m+[m[32mtaps_dfe = [5, 2, 1];[m
-[32m+[m[32mtrlen = 4096*2;[m
-[32m+[m[32mtrloops = 5;[m
-[32m+[m[32mddloops = 5;[m
-[32m+[m[32mK_FFE = 1;[m
-[32m+[m[32mDCmu = 0.005;[m
-[32m+[m[32mmu_ffe_values = [0.001, 0.0005, 0.001];[m
-[32m+[m[32mmu_dfe_values = 0.0007;[m
-[32m+[m[32mDDmu = [mu_ffe_values, mu_dfe_values];[m
-[32m+[m[32mDFEmu = 0.004;[m
-[32m+[m[32mFFEmu = 0;[m
-[32m+[m[32mplot_final = 0;[m
-[32m+[m[32midealdfe = 1;[m
-[32m+[m[32mnum_pf_coeffs = 1;[m
-[32m+[m[32mdamp_factor = 1;[m
-[32m+[m[32mnorm_loop_bw = 0.01;[m
-[32m+[m[32mdet_gain = 2.7;[m
-[32m+[m
-[32m+[m[32mstep_size = 0.0001;[m
-[32m+[m
-[32m+[m[32mBER = [];[m
-[32m+[m[32mtaps_ffe_and_dfe = zeros(1,6);[m
-[32m+[m[32mfor i = 1:6[m
-[32m+[m[32m for j = 1:200[m
-[32m+[m[32m taps_ffe_and_dfe(i) = j;[m
-[32m+[m[32m BER_run = first_analysis_2(taps_ffe_and_dfe(1:3), taps_ffe_and_dfe(4:6), trlen, trloops, ddloops, ...[m
-[32m+[m[32m K_FFE, DCmu, DDmu, DFEmu, FFEmu, plot_final, idealdfe, num_pf_coeffs, ...[m
-[32m+[m[32m damp_factor, norm_loop_bw, det_gain);[m
-[32m+[m[32m BER = [BER, BER_run];[m
-[32m+[m[32m close all[m
-[32m+[m[32m end[m
-[32m+[m[32m [~,index_minimum_ber] = min(BER);[m
-[32m+[m[32m taps_ffe_and_dfe(i) = index_minimum_ber;[m
-[32m+[m[32mend[m
-[32m+[m[32mdisp(taps_ffe_and_dfe)[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_ffe.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_ffe.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..8b55700[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_ffe.m[m
-[36m@@ -0,0 +1,57 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mffe_start = 0;[m
-[32m+[m[32mffe_step = 5;[m
-[32m+[m[32mffe_end = 30;[m
-[32m+[m[32mffe_first_order = ffe_start:ffe_step:ffe_end;[m
-[32m+[m
-[32m+[m[32mcurrent = 225:10:285;[m
-[32m+[m[32mcurrent = string(current);[m
-[32m+[m[32mpower = [28.02, 33.2, 37.5, 42.3, 46.3, 49.3, 53.4];[m
-[32m+[m[32mpower = string(power);[m
-[32m+[m[32mnum_pf_coeff = 4;[m
-[32m+[m[32m% taps_ffe = [300, 0, 0];[m
-[32m+[m[32mtaps_dfe = [0, 0, 0];[m
-[32m+[m[32mM = 4;[m
-[32m+[m[32mtrlength = 4096*4;[m
-[32m+[m[32mx = 225:10:285;[m
-[32m+[m[32mBER_PAM_4 = [];[m
-[32m+[m
-[32m+[m[32mfor i = 1:length(ffe_first_order)[m
-[32m+[m[32m for eq_method = 2[m
-[32m+[m[32m for j = 4[m
-[32m+[m[32m BER_run = first_analysis_ber(current(j), power(j), num_pf_coeff, [300, 15, ffe_first_order(i)], taps_dfe, M, trlength, eq_method);[m
-[32m+[m[32m BER_PAM_4 = [BER_PAM_4, BER_run];[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m[32msave('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')[m
-[32m+[m[32mBER_PAM_4 = [];[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mBER = load('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_4_FFE_Second_Order_Tap_Sweep.mat');[m
-[32m+[m[32mBER = BER.BER_PAM_4;[m
-[32m+[m[41m [m
-[32m+[m[32mfigure(202120)[m
-[32m+[m[32mplot(ffe_first_order, BER, '-o','LineWidth',1.75);[m
-[32m+[m[32mhold on[m
-[32m+[m
-[32m+[m[32mh1 = yline(2e-2, ':k', 'LineWidth',1.5);[m
-[32m+[m[32mh2 = yline(3.8e-3,':b', 'LineWidth',1.5);[m
-[32m+[m[32mh3 = yline(4.85e-3,':g', 'LineWidth',1.5);[m
-[32m+[m[32mh4 = yline(2.2e-4,':r', 'LineWidth',1.5);[m
-[32m+[m
-[32m+[m[32m% FEC Labels direkt im Plot[m
-[32m+[m[32mtext(286,2.2e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(285,3.3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(282.5,5.4e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex')[m
-[32m+[m[32mtext(287,2.4e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mxlabel('Number of DFE First Order Taps', 'Interpreter','latex')[m
-[32m+[m[32mylabel('BER', 'Interpreter','latex')[m
-[32m+[m[32m% title('BER for PAM-4', 'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mgrid minor[m
-[32m+[m[32m% ylim([1e-4 5e-1])[m
-[32m+[m[32mset(gca,'YScale','log')[m
-[32m+[m[32m% beautifyBERplot[m
-[32m+[m[32mhold off[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..f867c5a[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_optimize_timing_recovery_parameters.m[m
-[36m@@ -0,0 +1,68 @@[m
-[32m+[m[32m%% Fixe Simulationsparameter[m
-[32m+[m[32mbaud_rate = 6;[m
-[32m+[m[32mpower = 42.3;[m
-[32m+[m[32mnum_pf_coeff = 4;[m
-[32m+[m[32mM = 4;[m
-[32m+[m[32mtrlength = 4096*2;[m
-[32m+[m
-[32m+[m[32m%% === Suchräume für Tap-Werte (selbst bestimmbar) =================[m
-[32m+[m[32m% WICHTIG: wähle Grenzen passend zur Skalierung deiner Taps.[m
-[32m+[m[32m% Beispiel: FFE Taps vielleicht grob im Bereich [-500 .. 500],[m
-[32m+[m[32m% DFE Taps eher kleiner, z.B. [-50 .. 50] – anpassen![m
-[32m+[m[32mffeRange = [0, 500];[m
-[32m+[m[32mdfeRange = [0, 200];[m
-[32m+[m
-[32m+[m[32mvars = [[m
-[32m+[m[32m optimizableVariable('ffe1', ffeRange)[m
-[32m+[m[32m optimizableVariable('ffe2', ffeRange)[m
-[32m+[m[32m optimizableVariable('ffe3', ffeRange)[m
-[32m+[m
-[32m+[m[32m optimizableVariable('dfe1', dfeRange)[m
-[32m+[m[32m optimizableVariable('dfe2', dfeRange)[m
-[32m+[m[32m optimizableVariable('dfe3', dfeRange)[m
-[32m+[m[32m];[m
-[32m+[m
-[32m+[m[32m%% === Objective ===================================================[m
-[32m+[m[32mobjectiveFcn = @(x) objectiveWrapperTaps(x, ...[m
-[32m+[m[32m baud_rate, power, num_pf_coeff, M, trlength);[m
-[32m+[m
-[32m+[m[32m%% === bayesopt ====================================================[m
-[32m+[m[32mresults = bayesopt(objectiveFcn, vars, ...[m
-[32m+[m[32m 'AcquisitionFunctionName','expected-improvement-plus', ...[m
-[32m+[m[32m 'MaxObjectiveEvaluations', 60, ...[m
-[32m+[m[32m 'IsObjectiveDeterministic', false, ...[m
-[32m+[m[32m 'ExplorationRatio', 0.5, ...[m
-[32m+[m[32m 'Verbose', 1, ...[m
-[32m+[m[32m 'PlotFcn', {@plotObjectiveModel,@plotMinObjective});[m
-[32m+[m
-[32m+[m[32m%% === Beste Lösung ausgeben ======================================[m
-[32m+[m[32mbestX = results.XAtMinObjective;[m
-[32m+[m[32mbestBER = results.MinObjective;[m
-[32m+[m
-[32m+[m[32mbestFFE = [bestX.ffe1, bestX.ffe2, bestX.ffe3];[m
-[32m+[m[32mbestDFE = [bestX.dfe1, bestX.dfe2, bestX.dfe3];[m
-[32m+[m
-[32m+[m[32mfprintf('\n=== Bestes Ergebnis ===\n');[m
-[32m+[m[32mfprintf('BER : %.3e\n', bestBER);[m
-[32m+[m[32mfprintf('taps_ffe : [%g %g %g]\n', bestFFE);[m
-[32m+[m[32mfprintf('taps_dfe : [%g %g %g]\n\n', bestDFE);[m
-[32m+[m
-[32m+[m[32m%% =================================================================[m
-[32m+[m[32mfunction ber = objectiveWrapperTaps(x, baud_rate, power, num_pf_coeff, M, trlength)[m
-[32m+[m[32m taps_ffe = double([x.ffe1, x.ffe2, x.ffe3]);[m
-[32m+[m[32m taps_dfe = double([x.dfe1, x.dfe2, x.dfe3]);[m
-[32m+[m
-[32m+[m[32m % Optional: falls du z.B. Monotonicität / Struktur erzwingen willst, hier.[m
-[32m+[m[32m % taps_dfe(1) = 0; % Beispiel: ersten DFE-Tap fixieren[m
-[32m+[m
-[32m+[m[32m try[m
-[32m+[m[32m ber = first_analysis_optimize(baud_rate, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength);[m
-[32m+[m
-[32m+[m[32m if isempty(ber) || ~isscalar(ber) || ~isfinite(ber) || ber < 0[m
-[32m+[m[32m ber = 1; % Penalty[m
-[32m+[m[32m end[m
-[32m+[m[32m catch ME[m
-[32m+[m[32m warning("Objective failed: %s", ME.message);[m
-[32m+[m[32m ber = 1; % Penalty[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_2.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_2.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..b0310bd[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_2.m[m
-[36m@@ -0,0 +1,66 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mcurrent = 225:10:285;[m
-[32m+[m[32mcurrent = string(current);[m
-[32m+[m[32mpower = [28.02, 33.2, 37.5, 42.3, 46.3, 49.3, 53.4];[m
-[32m+[m[32mpower = string(power);[m
-[32m+[m[32mnum_pf_coeff = 4;[m
-[32m+[m[32mtaps_ffe = [200, 0, 0];[m
-[32m+[m[32mtaps_dfe = [0, 0, 0];[m
-[32m+[m[32mM = 2;[m
-[32m+[m[32mtrlength = 4096*2;[m
-[32m+[m[32mx = 225:10:285;[m
-[32m+[m[32mBER_PAM_2 = [];[m
-[32m+[m[32mpost_only = 0;[m
-[32m+[m
-[32m+[m[32mfor eq_method = 2:4[m
-[32m+[m
-[32m+[m[32m if ~post_only[m
-[32m+[m[32m for j = 1:length(current)[m
-[32m+[m[32m BER_run = first_analysis_ber(current(j), power(j), num_pf_coeff, taps_ffe, taps_dfe, M, trlength, eq_method);[m
-[32m+[m[32m BER_PAM_2 = [BER_PAM_2, BER_run];[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m 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')[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mx = 225:10:285;[m
-[32m+[m[32mfor k = 1:4[m
-[32m+[m[32m BER = load('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_2_' + string(k) + '.mat');[m
-[32m+[m[32m BER = BER.BER_PAM_2;[m
-[32m+[m[41m [m
-[32m+[m[32m figure(202120)[m
-[32m+[m[32m plot(x, BER, '-o','LineWidth',1.75);[m
-[32m+[m[32m hold on[m
-[32m+[m[32mend[m
-[32m+[m[32mold_BER = [-1.5, -1.75, -2, -2.3, -2.6, -2.25, -1.95];[m
-[32m+[m[32mold_BER = 10.^(old_BER);[m
-[32m+[m[32mplot(x, old_BER, '-o','LineWidth',1.75)[m
-[32m+[m[41m [m
-[32m+[m[32mh1 = yline(2e-2, ':k', 'LineWidth',1.5);[m
-[32m+[m[32mh2 = yline(3.8e-3,':b', 'LineWidth',1.5);[m
-[32m+[m[32mh3 = yline(4.85e-3,':g', 'LineWidth',1.5);[m
-[32m+[m[32mh4 = yline(2.2e-4,':r', 'LineWidth',1.5);[m
-[32m+[m
-[32m+[m[32m% Legende NUR für Kurven[m
-[32m+[m[32mlegend('FFE', 'FFE+PF+MLSE', 'DB', 'ML-MLSE', 'BER Paper', ...[m
-[32m+[m[32m 'Interpreter','latex', ...[m
-[32m+[m[32m 'Location','southwest', 'FontSize', 14)[m
-[32m+[m
-[32m+[m[32m% FEC Labels direkt im Plot[m
-[32m+[m[32mtext(280,2.2e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(280,3.3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(280,5.4e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex')[m
-[32m+[m[32mtext(280,2.4e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mxlabel('Laser Bias Current [mA]', 'Interpreter','latex')[m
-[32m+[m[32mylabel('BER', 'Interpreter','latex')[m
-[32m+[m[32m% title('BER for PAM-2', 'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mgrid minor[m
-[32m+[m[32mylim([1e-4 5e-1])[m
-[32m+[m[32mset(gca,'YScale','log')[m
-[32m+[m[32m% beautifyBERplot[m
-[32m+[m[32mhold off[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..cf3b301[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4.m[m
-[36m@@ -0,0 +1,61 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mcurrent = 225:10:285;[m
-[32m+[m[32mcurrent = string(current);[m
-[32m+[m[32mpower = [28.02, 33.2, 37.5, 42.3, 46.3, 49.3, 53.4];[m
-[32m+[m[32mpower = string(power);[m
-[32m+[m[32mnum_pf_coeff = 4;[m
-[32m+[m[32mtaps_ffe = [300, 0, 0];[m
-[32m+[m[32mtaps_dfe = [5, 0, 0];[m
-[32m+[m[32mM = 4;[m
-[32m+[m[32mtrlength = 4096*4;[m
-[32m+[m[32mx = 225:10:285;[m
-[32m+[m[32mBER_PAM_4 = [];[m
-[32m+[m
-[32m+[m[32mfor eq_method = 2[m
-[32m+[m[32m for j = 4[m
-[32m+[m[32m BER_run = first_analysis_ber(current(j), power(j), num_pf_coeff, taps_ffe, taps_dfe, M, trlength, eq_method);[m
-[32m+[m[32m BER_PAM_4 = [BER_PAM_4, BER_run];[m
-[32m+[m[32m end[m
-[32m+[m[32m 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')[m
-[32m+[m[32m BER_PAM_4 = [];[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mx = 225:10:285;[m
-[32m+[m[32mfor k = 1:4[m
-[32m+[m[32m BER = load('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_4_' + string(k) + '.mat');[m
-[32m+[m[32m BER = BER.BER_PAM_4;[m
-[32m+[m[41m [m
-[32m+[m[32m figure(202120)[m
-[32m+[m[32m plot(x, BER, '-o','LineWidth',1.75);[m
-[32m+[m[32m hold on[m
-[32m+[m[32mend[m
-[32m+[m[32mold_BER = [-1.6, -1.85, -2.2, -2.45, -2.3, -2, -1.4];[m
-[32m+[m[32mold_BER = 10.^(old_BER);[m
-[32m+[m[32mplot(x, old_BER, '-o','LineWidth',1.75)[m
-[32m+[m
-[32m+[m[32mh1 = yline(2e-2, ':k', 'LineWidth',1.5);[m
-[32m+[m[32mh2 = yline(3.8e-3,':b', 'LineWidth',1.5);[m
-[32m+[m[32mh3 = yline(4.85e-3,':g', 'LineWidth',1.5);[m
-[32m+[m[32mh4 = yline(2.2e-4,':r', 'LineWidth',1.5);[m
-[32m+[m
-[32m+[m[32m% Legende NUR für Kurven[m
-[32m+[m[32mlegend('FFE', 'FFE+PF+MLSE', 'DB', 'ML-MLSE', 'BER Paper', ...[m
-[32m+[m[32m 'Interpreter','latex', ...[m
-[32m+[m[32m 'Location','southwest', 'FontSize', 14)[m
-[32m+[m
-[32m+[m[32m% FEC Labels direkt im Plot[m
-[32m+[m[32mtext(286,2.2e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(285,3.3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(282.5,5.4e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex')[m
-[32m+[m[32mtext(287,2.4e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mxlabel('Laser Bias Current [mA]', 'Interpreter','latex')[m
-[32m+[m[32mylabel('BER', 'Interpreter','latex')[m
-[32m+[m[32m% title('BER for PAM-4', 'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mgrid minor[m
-[32m+[m[32mylim([1e-4 5e-1])[m
-[32m+[m[32mset(gca,'YScale','log')[m
-[32m+[m[32m% beautifyBERplot[m
-[32m+[m[32mhold off[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..0575787[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4_baud_rate_sweep.m[m
-[36m@@ -0,0 +1,77 @@[m
-[32m+[m[32mbaud_rate = 4:1:8;[m
-[32m+[m[32mbaud_rate = string(baud_rate);[m
-[32m+[m[32mpower = [8.4, 8.4, 42.3, 8.4, 8.4];[m
-[32m+[m[32mpower = string(power);[m
-[32m+[m[32mnum_pf_coeff = 4;[m
-[32m+[m[32mtaps_ffe = [300, 0, 0];[m
-[32m+[m[32mtaps_dfe = [0, 0, 0];[m
-[32m+[m[32mM = 4;[m
-[32m+[m[32mtrlength = 4096*4;[m
-[32m+[m[32mx = 4:1:8;[m
-[32m+[m[32mBER_PAM_4 = [];[m
-[32m+[m[32mAlpha_PAM_4 = [];[m
-[32m+[m
-[32m+[m[32mfor method = 1:4[m
-[32m+[m[32m for i = 1:5[m
-[32m+[m[32m [BER_run, ~] = first_analysis_baud_rate_sweep(baud_rate(i), power(i), num_pf_coeff, taps_ffe, taps_dfe, M, trlength, method);[m
-[32m+[m[32m BER_PAM_4 = [BER_PAM_4, BER_run];[m
-[32m+[m[32m % Alpha_PAM_4 = [Alpha_PAM_4, Alpha_run];[m
-[32m+[m[32m end[m
-[32m+[m[32m 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')[m
-[32m+[m[32m BER_PAM_4 = [];[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% BER[m
-[32m+[m[32mfor k = 1:4[m
-[32m+[m[32m 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');[m
-[32m+[m[32m BER = BER.BER_PAM_4;[m
-[32m+[m[32m % x = BER.x;[m
-[32m+[m[32m % BER_Alpha = load(filename);[m
-[32m+[m[32m % BER = BER_Alpha.BER_PAM_4;[m
-[32m+[m[41m [m
-[32m+[m[32m % close all[m
-[32m+[m[32m figure(239)[m
-[32m+[m[32m plot(x, BER, '-o','LineWidth',1.75)[m
-[32m+[m[32m hold on[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m% old_BER = [-4.4, -4, -3.3, -2.7, -2.5, -2.475];[m
-[32m+[m[32m% old_BER = 10.^(old_BER);[m
-[32m+[m[32m% plot(x, old_BER, '--o','LineWidth',1)[m
-[32m+[m
-[32m+[m[32mh1 = yline(2e-2, ':k', 'LineWidth',1.5);[m
-[32m+[m[32mh2 = yline(3.8e-3,':b', 'LineWidth',1.5);[m
-[32m+[m[32mh3 = yline(4.85e-3,':g', 'LineWidth',1.5);[m
-[32m+[m[32mh4 = yline(2.2e-4,':r', 'LineWidth',1.5);[m
-[32m+[m
-[32m+[m[32m% Legende NUR für Kurven[m
-[32m+[m[32mlegend('FFE','FFE+PF+MLSE','DB','ML-MLSE',...[m
-[32m+[m[32m 'Interpreter','latex', ...[m
-[32m+[m[32m 'Location','southwest', 'FontSize', 14)[m
-[32m+[m
-[32m+[m[32m% FEC Labels direkt im Plot[m
-[32m+[m[32mtext(8.2,2.3e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(8.2,3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(8.2,5.6e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex')[m
-[32m+[m[32mtext(8.2,2.5e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mxlabel('Symbol Rate [GBd]', 'Interpreter','latex')[m
-[32m+[m[32mylabel('BER', 'Interpreter','latex')[m
-[32m+[m[32m% title('BER for PAM-4', 'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mgrid minor[m
-[32m+[m[32m% ylim([1e-4 5e-2])[m
-[32m+[m[32mxlim([3 9])[m
-[32m+[m[32mset(gca,'YScale','log')[m
-[32m+[m[32mhold off[m
-[32m+[m
-[32m+[m[32m%% Channel Alpha[m
-[32m+[m[32m% Alpha = BER_Alpha.Alpha_PAM_4;[m
-[32m+[m[32m% figure[m
-[32m+[m[32m% plot(x, Alpha, '--o','LineWidth',1)[m
-[32m+[m[32m% hold on[m
-[32m+[m[32m% xlabel('Symbol Rate [GBd]', 'Interpreter','latex')[m
-[32m+[m[32m% ylabel('Channel Alpha', 'Interpreter','latex')[m
-[32m+[m[32m% title('Channel Alpha for PAM-4 - 300-Tap-FFE - 1 Postfilter Coefficients - 8192 Training Symbols', 'Interpreter','latex')[m
-[32m+[m[32m% grid minor[m
-[32m+[m[32m% hold off[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_timing_shift.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_timing_shift.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..435b540[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_timing_shift.m[m
-[36m@@ -0,0 +1,9 @@[m
-[32m+[m[32mtime_shift = -2:0.1:2;[m
-[32m+[m[32mBER = zeros(1,length(time_shift));[m
-[32m+[m[32mfor i = 1:length(time_shift)[m
-[32m+[m[32m BER_value = first_analysis_time_shift(time_shift(i));[m
-[32m+[m[32m BER(i) = BER_value;[m
-[32m+[m[32m close all[m
-[32m+[m[32mend[m
-[32m+[m[32mfigure;[m
-[32m+[m[32mplot(time_shift,BER)[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_2.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_2.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..c3a44f0[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_2.m[m
-[36m@@ -0,0 +1,190 @@[m
-[32m+[m[32mfunction 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)[m
-[32m+[m[32m %%[m
-[32m+[m[32m base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32m mode = 0; %0 oder 1[m
-[32m+[m[32m M = 2;[m
-[32m+[m[41m [m
-[32m+[m[32m all_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m tx_data = load(tx_data_path);[m
-[32m+[m[32m datas = load(filename);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m str = filename;[m
-[32m+[m[32m M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m assert(M==M_);[m
-[32m+[m[32m fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m % Tx data[m
-[32m+[m[41m [m
-[32m+[m[32m Bits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32m Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m 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[m
-[32m+[m[32m PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m[41m [m
-[32m+[m[32m Symbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32m assert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m[41m [m
-[32m+[m[32m Bits_ = PM.demap(Symbols);[m
-[32m+[m[32m [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32m assert(ber == 0);[m
-[32m+[m[41m [m
-[32m+[m[32m %% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32m Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Digi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32m MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Rx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx Data[m
-[32m+[m[32m traceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m[41m [m
-[32m+[m[32m %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32m scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32m demystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32m assert(demystified);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32m Scope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m[41m [m
-[32m+[m[32m % 1) matched filter[m
-[32m+[m[32m % pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m % It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m % -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32m Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32m Rx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32m Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m[41m [m
-[32m+[m[32m % timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m % try to do this with 2sps EQ![m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32m Rx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_Time_Rec = Rx_matched;[m
-[32m+[m[32m [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2, ...[m
-[32m+[m[32m 'damping_factor',damp_factor,'normalized_loop_bandwidth',norm_loop_bw,'detector_gain',det_gain).process(Rx_matched_1);[m
-[32m+[m[32m figure;plot(Timing_Error);[m
-[32m+[m[32m % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 28e9, 14e9);[m
-[32m+[m[41m [m
-[32m+[m[32m %% not working..[m[41m [m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m Rx_synced.fs = 14e9;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m % len_tr = trlen;[m
-[32m+[m[32m % mu_ffe1 = mu_ffe_values(1);[m
-[32m+[m[32m % mu_ffe2 = mu_ffe_values(2);[m
-[32m+[m[32m % mu_ffe3 = mu_ffe_values(3);[m
-[32m+[m[32m % mu_dc = 0.005;[m
-[32m+[m[32m % mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m % mu_dfe = mu_dfe_values;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',2);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',0);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',0);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',0);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m % eq_ffe = EQ("Ne",taps_ffe,"Nb",taps_dfe, ...[m
-[32m+[m[32m % "training_length",trlen,"training_loops",trloops,"dd_loops",ddloops, ...[m
-[32m+[m[32m % "K",K_FFE,"DCmu",DCmu,"DDmu",DDmu,"DFEmu",DFEmu, ...[m
-[32m+[m[32m % "FFEmu",FFEmu,"plotfinal",plot_final,"ideal_dfe",idealdfe);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m % "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % % ffe_results.metrics.print[m
-[32m+[m[32m % fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % BER_value = ffe_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m
-[32m+[m[32m pf_ncoeffs = num_pf_coeffs;[m
-[32m+[m[32m eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ...[m
-[32m+[m[32m "training_length",trlen,"training_loops",trloops,"dd_loops",ddloops, ...[m
-[32m+[m[32m "K",K_FFE,"DCmu",DCmu,"DDmu",DDmu,"DFEmu",DFEmu, ...[m
-[32m+[m[32m "FFEmu",FFEmu,"plotfinal",plot_final,"ideal_dfe",idealdfe);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER_value = mlse_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m %% -------------------- DB target --------------------[m
-[32m+[m[32m % mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % eq_ = EQ("Ne",taps_ffe,"Nb",taps_dfe, ...[m
-[32m+[m[32m % "training_length",trlen,"training_loops",trloops,"dd_loops",ddloops, ...[m
-[32m+[m[32m % "K",K_FFE,"DCmu",DCmu,"DDmu",DDmu,"DFEmu",DFEmu, ...[m
-[32m+[m[32m % "FFEmu",FFEmu,"plotfinal",plot_final,"ideal_dfe",idealdfe);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m % "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % dbt_results.metrics.print("description",'Duobinary');[m
-[32m+[m[32m % mlse_results.metrics.print[m
-[32m+[m[32m % fprintf('My EQ: %.1e \n',dbt_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ...[m
-[32m+[m[32m % "len_tr",length(Rx_synced)/2,"mu_dd",0.03,"mu_tr",0.03,"order",30,"sps",1, ...[m
-[32m+[m[32m % "traceback_depth",256,"L",2,"delta",10,"adaptive_mu",0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m % fprintf('ML-based MLSE:');[m
-[32m+[m[32m % fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % % -------------------- Post-FFE --------------------[m
-[32m+[m[32m % 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);[m
-[32m+[m[32m % post_ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m % "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m % fprintf('Post-FFE:');[m
-[32m+[m[32m % fprintf('My EQ: %.1e \n',post_ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..0fe859c[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_baud_rate_sweep.m[m
-[36m@@ -0,0 +1,202 @@[m
-[32m+[m[32mfunction [BER, Channel_Alpha] = first_analysis_baud_rate_sweep(baud_rate, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength, method)[m
-[32m+[m[32m %%[m
-[32m+[m[32m close all[m
-[32m+[m[32m base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\Sweep Data\";[m
-[32m+[m[32m mode = 0; %0 oder 1[m
-[32m+[m[32m % M = 2;[m
-[32m+[m[41m [m
-[32m+[m[32m all_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, baud_rate + "G_PAM4\tx_info\tx_info_PAM4_" + baud_rate + "Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m tx_data = load(tx_data_path);[m
-[32m+[m[32m datas = load(filename);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m str = filename;[m
-[32m+[m[32m M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m assert(M==M_);[m
-[32m+[m[32m fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m % Tx data[m
-[32m+[m[41m [m
-[32m+[m[32m Bits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32m Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m 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[m
-[32m+[m[32m PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m[41m [m
-[32m+[m[32m Symbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32m assert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m[41m [m
-[32m+[m[32m Bits_ = PM.demap(Symbols);[m
-[32m+[m[32m [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32m assert(ber == 0);[m
-[32m+[m[41m [m
-[32m+[m[32m %% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32m Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Digi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32m MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Rx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx Data[m
-[32m+[m[32m traceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m[41m [m
-[32m+[m[32m %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32m scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32m demystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32m assert(demystified);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32m Scope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m Kov = 14;[m
-[32m+[m
-[32m+[m[32m Scope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m % 1) matched filter[m
-[32m+[m[32m % pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m % It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m % -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32m Matched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32m Rx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32m Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m[41m [m
-[32m+[m[32m % timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m % try to do this with 2sps EQ![m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32m Rx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_Time_Rec = Rx_matched;[m
-[32m+[m[32m % Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1);[m
-[32m+[m[41m [m
-[32m+[m[32m Time_Rec = 1;[m
-[32m+[m[32m if Time_Rec[m
-[32m+[m[32m 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);[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32m else[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m Rx_Time_Rec.fs = fsym;[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9);[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_matched_1.plot("fignum",231231)[m
-[32m+[m[32m % Rx_Time_Rec.plot("fignum",231231)[m
-[32m+[m[41m [m
-[32m+[m[32m %% not working..[m[41m [m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m len_tr = trlength;[m
-[32m+[m[32m mu_ffe1 = 0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.004;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m mu_dfe = 0.0004;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32m Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if method == 1[m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[41m [m
-[32m+[m[32m ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[41m [m
-[32m+[m[32m % ffe_results.metrics.print[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER = ffe_results.metrics.BER;[m
-[32m+[m[41m [m
-[32m+[m[32m elseif method == 2[m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[32m pf_ncoeffs = num_pf_coeff;[m
-[32m+[m[32m eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m[41m [m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m[41m [m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER = mlse_results.metrics.BER;[m
-[32m+[m[32m % Channel_Alpha = mlse_results.metrics.Alpha;[m
-[32m+[m[41m [m
-[32m+[m[32m elseif method == 3[m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ...[m
-[32m+[m[32m "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",sps, ...[m
-[32m+[m[32m "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0);[m
-[32m+[m[41m [m
-[32m+[m[32m [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m fprintf('ML-based MLSE:\n');[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER = ml_mlse_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m elseif method == 4[m
-[32m+[m[32m %% -------------------- DB target --------------------[m
-[32m+[m[32m mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);[m
-[32m+[m[41m [m
-[32m+[m[32m eq_ = EQ("Ne",taps_ffe,"Nb",taps_dfe,"training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[41m [m
-[32m+[m[32m dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[41m [m
-[32m+[m[32m dbt_results.metrics.print("description",'Duobinary');[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',dbt_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER = dbt_results.metrics.BER;[m
-[32m+[m[32m end[m
-[32m+[m[32m Channel_Alpha = 0;[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_ber.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_ber.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..bc02b58[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_ber.m[m
-[36m@@ -0,0 +1,207 @@[m
-[32m+[m[32mfunction BER_value = first_analysis_ber(current, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength, eq_method)[m
-[32m+[m[32m %%[m
-[32m+[m[32m close all[m
-[32m+[m
-[32m+[m[32m %%[m
-[32m+[m[32m base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32m mode = 0; %0 oder 1[m
-[32m+[m[32m % M = 2;[m
-[32m+[m[41m [m
-[32m+[m[32m all_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m tx_data = load(tx_data_path);[m
-[32m+[m[32m datas = load(filename);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m str = filename;[m
-[32m+[m[32m M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m assert(M==M_);[m
-[32m+[m[32m fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m % Tx data[m
-[32m+[m[41m [m
-[32m+[m[32m Bits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32m Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m 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[m
-[32m+[m[32m PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m[41m [m
-[32m+[m[32m Symbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32m assert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m[41m [m
-[32m+[m[32m Bits_ = PM.demap(Symbols);[m
-[32m+[m[32m [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32m assert(ber == 0);[m
-[32m+[m[41m [m
-[32m+[m[32m %% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32m Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Digi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32m MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Rx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx Data[m
-[32m+[m[32m traceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m[41m [m
-[32m+[m[32m %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32m scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32m demystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32m assert(demystified);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32m Scope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m Kov = 14;[m
-[32m+[m
-[32m+[m[32m Scope_sig = Scope_sig.resample('fs_in', fs, 'fs_out', Kov*fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m % 1) matched filter[m
-[32m+[m[32m % pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m % It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m % -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32m Matched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32m Rx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32m Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m[41m [m
-[32m+[m[32m % timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m % try to do this with 2sps EQ![m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32m Rx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_Time_Rec = Rx_matched;[m
-[32m+[m[32m % Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1);[m
-[32m+[m[41m [m
-[32m+[m[32m Time_Rec = 1;[m
-[32m+[m[32m if Time_Rec[m
-[32m+[m[32m 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);[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32m else[m
-[32m+[m[32m sps = Kov;[m
-[32m+[m[32m end[m
-[32m+[m[32m Rx_Time_Rec.fs = fsym;[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9);[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_matched_1.plot("fignum",231231)[m
-[32m+[m[32m % Rx_Time_Rec.plot("fignum",231231)[m
-[32m+[m[41m [m
-[32m+[m[32m %% not working..[m[41m [m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m len_tr = trlength;[m
-[32m+[m[32m mu_ffe1 = 0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.004;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m mu_dfe = 0.0004;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32m Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m if eq_method == 1[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[41m [m
-[32m+[m[32m ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[41m [m
-[32m+[m[32m % ffe_results.metrics.print[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER_value = ffe_results.metrics.BER;[m
-[32m+[m[41m [m
-[32m+[m[32m elseif eq_method == 2[m
-[32m+[m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[41m [m
-[32m+[m[32m pf_ncoeffs = num_pf_coeff;[m
-[32m+[m[32m eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m[41m [m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m[41m [m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER_value = mlse_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m elseif eq_method == 3[m
-[32m+[m
-[32m+[m[32m %% -------------------- DB target --------------------[m
-[32m+[m[32m mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);[m
-[32m+[m
-[32m+[m[32m eq_ = EQ("Ne",taps_ffe,"Nb",taps_dfe,"training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m
-[32m+[m[32m dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m
-[32m+[m[32m dbt_results.metrics.print("description",'Duobinary');[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',dbt_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER_value = dbt_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m elseif eq_method == 4[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ...[m
-[32m+[m[32m "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",1, ...[m
-[32m+[m[32m "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0);[m
-[32m+[m[41m [m
-[32m+[m[32m [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m fprintf('ML-based MLSE:\n');[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER_value = ml_mlse_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_mf.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_mf.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..b2a6027[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_mf.m[m
-[36m@@ -0,0 +1,293 @@[m
-[32m+[m
-[32m+[m[32m<<<<<<< HEAD[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32m=======[m
-[32m+[m[32mbase = "C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC";[m
-[32m+[m[32m>>>>>>> 719e5508e776c18e3dcf72a954c71bdedda179e0[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 2;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m<<<<<<< HEAD[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m=======[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m 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");[m
-[32m+[m[32m>>>>>>> 719e5508e776c18e3dcf72a954c71bdedda179e0[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_tx_compare = Pform.process(Symbols);[m
-[32m+[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sync = Pform.process(Symbols);[m
-[32m+[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_tx_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mtimesig_compare = [0:1:datas.tr.lastData(1).trace.ch3.Points-1] ./ fs;[m
-[32m+[m[32mtimesig = datas.tr.lastData(1).trace.ch3.XData;[m
-[32m+[m[32massert(isequal(traceData.YData,scoperead_volts));[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef directly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mapply_matched_filter = 0;[m
-[32m+[m[32mk = 4;[m
-[32m+[m[32mif apply_matched_filter[m
-[32m+[m[41m [m
-[32m+[m[32m Pform = Pulseformer("fsym",fsym,"fdac",k*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32m Rx_matched = Pform.process(Scope_sig);[m
-[32m+[m[32melse[m
-[32m+[m
-[32m+[m[32m Rx_matched = Filter('filtdegree',4,"f_cutoff",fsym*0.5,"fs",Scope_sig.fs,"filterType",filtertypes.gaussian,"active",true).process(Scope_sig);[m
-[32m+[m[32m Rx_matched = Rx_matched.resample("fs_out",k*fsym);[m
-[32m+[m[32mend[m
-[32m+[m[32mRx_matched.spectrum();[m
-[32m+[m
-[32m+[m[32m<<<<<<< HEAD[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32msys = comm.SymbolSynchronizer('TimingErrorDetector', 'Gardner (non-data-aided)', ...[m
-[32m+[m[32m 'SamplesPerSymbol', 2, ...[m
-[32m+[m[32m 'DampingFactor', 0.7, ...[m
-[32m+[m[32m 'NormalizedLoopBandwidth', 0.01);[m
-[32m+[m[32mRx_symbolsync = Rx_matched;[m
-[32m+[m[32m[Rx_symbolsync.signal, timing_error] = sys(Rx_matched.signal);[m
-[32m+[m
-[32m+[m[32mplot(timing_error); % If this is a ramp, you have drift![m
-[32m+[m
-[32m+[m[32m%% timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% % try to do this with 2sps EQ![m
-[32m+[m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_symbolsync.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32m% Rx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% % Rx_Time_Rec = Rx_matched;[m
-[32m+[m[32m% [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);[m
-[32m+[m[32m% figure;plot(Timing_Error);[m
-[32m+[m[32m% % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 28e9, 14e9);[m
-[32m+[m
-[32m+[m[32m%% not working..[m[41m [m
-[32m+[m[32m% Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32mRx_synced = Rx_synced_cell{1};[m
-[32m+[m[32mlen_tr = 4096*2;[m
-[32m+[m[32mmu_ffe1 = 0.0001;[m
-[32m+[m[32mmu_ffe2 = 0.0008;[m
-[32m+[m[32mmu_ffe3 = 0.001;[m
-[32m+[m[32mmu_dc = 0.005;[m
-[32m+[m[32mmu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32mRx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',2);[m
-[32m+[m
-[32m+[m[32mDigi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',0);[m
-[32m+[m[32mRx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',0);[m
-[32m+[m[32mRx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',0);[m
-[32m+[m[32m=======[m
-[32m+[m[32m%% Timing Rec[m
-[32m+[m[32mapply_timing_rec = 1;[m
-[32m+[m[32mif apply_timing_rec[m
-[32m+[m[32m [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);[m
-[32m+[m[32m figure();plot(timing_error);[m
-[32m+[m[32m Rx_symbolsync.fs = fsym;[m
-[32m+[m[32m % Tsynch[m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_symbolsync.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0);[m
-[32m+[m[32m Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32melse[m
-[32m+[m[32m % Tsynch[m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0);[m
-[32m+[m[32m Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m Rx_synced = Rx_synced.resample("fs_out",2*fsym);[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32mend[m
-[32m+[m[32m>>>>>>> 719e5508e776c18e3dcf72a954c71bdedda179e0[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32mRx_synced = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m
-[32m+[m[32m% -------------------- FFE --------------------[m
-[32m+[m[32m% requires some more digging what is going on :-)[m
-[32m+[m[32meq_ffe = EQ("Ne",[50, 1, 1],"Nb",[2,0,0], ...[m
-[32m+[m[32m "training_length",512,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m
-[32m+[m[32mvars = logspace(-4,-3,36);[m
-[32m+[m
-[32m+[m[32mparfor i = 1:numel(vars)[m
-[32m+[m
-[32m+[m[32m len_tr = 4096;[m
-[32m+[m[32m mu_ffe1 = 0.01;% mus(i);%0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.005;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3];[m
-[32m+[m[32m mu_dfe = vars(i);[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32m % requires some more digging what is going on :-)[m
-[32m+[m[32m eq_ffe_1 = EQ("Ne",[150, 1, 0],"Nb",[50,0,0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",0);[m
-[32m+[m
-[32m+[m[32m 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);[m
-[32m+[m[32m % 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);[m
-[32m+[m
-[32m+[m
-[32m+[m[32m ffe_results = ffe(eq_ffe_1,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m "precode_mode",duob_mode,'showAnalysis',1,"postFFE",[], ...[m
-[32m+[m[32m "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m
-[32m+[m[32m ffe_results.metrics.BER[m
-[32m+[m[32m bers(i) = ffe_results.metrics.BER;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mfigure();[m
-[32m+[m[32mplot(vars,bers);[m
-[32m+[m[32myline(ber_in_paper)[m
-[32m+[m[32mbeautifyBERplot();[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32mffe_results.metrics.print("description",'FFE');[m
-[32m+[m[32mfprintf('FFE: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[32mlen_tr = 4096;[m
-[32m+[m[32mmu_ffe1 = 0.0001;% mus(i);%0.0001;[m
-[32m+[m[32mmu_ffe2 = 0.0008;[m
-[32m+[m[32mmu_ffe3 = 0.001;[m
-[32m+[m[32mmu_dc = 0.005;[m
-[32m+[m[32mmu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32mpf_ncoeffs = 4;[m
-[32m+[m
-[32m+[m[32mvars = 1:7;[m
-[32m+[m[32mbers = zeros(size(vars));[m
-[32m+[m[32mparfor i = 1:numel(vars)[m
-[32m+[m[41m [m
-[32m+[m[32m eqv = EQ("Ne",[200, 1, 0],"Nb",[2, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m pf_ncoeffs = vars(i);[m
-[32m+[m[32m pf = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eqv, pf, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m vnle_results.metrics.print("description",'VNLE');[m
-[32m+[m[32m mlse_results.metrics.print("description",'MLSE');[m
-[32m+[m[32m bers(i) = mlse_results.metrics.BER;[m
-[32m+[m[32mend[m
-[32m+[m[32m%%[m
-[32m+[m[32mfigure();hold on[m
-[32m+[m[32mplot(vars,bers_ffe,'DisplayName','FFE [200,0,0] + PF + MLSE');[m
-[32m+[m[32mplot(vars,bers_vnle,'DisplayName','VNLE [200,1,0] + PF + MLSE');[m
-[32m+[m[32mplot(vars,bers_vnledfe,'DisplayName','VNLE [200,1,0] + DFE [2] + PF + MLSE');[m
-[32m+[m[32mplot(vars,bers_vnledfe_ideal,'DisplayName','VNLE [200,1,0] + ideal DFE [2] + PF + MLSE');[m
-[32m+[m[32myline(ber_in_paper);[m
-[32m+[m[32myline([2e-2, 4.85e-3, 3.8e-3, 2,2e-4],'LineWidth',2,'Color',[0.8,0.8,0.8],'LineStyle',':','HandleVisibility','off');[m
-[32m+[m[32mylim([1e-5,0.1]);[m
-[32m+[m[32mbeautifyBERplot();[m
-[32m+[m
-[32m+[m[32m%% -------------------- DB target --------------------[m
-[32m+[m[32mmlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);[m
-[32m+[m
-[32m+[m[32meq_ = EQ("Ne",[50, 5, 5],"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m
-[32m+[m[32mdbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32mdbt_results.metrics.print("description",'Duobinary');[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m%ML-based MLSE (L=2)[m
-[32m+[m[32mmu_ml = 0.01; training_epochs = 100;[m
-[32m+[m[32mml_mlse_equalizer = ML_MLSE("epochs_tr",training_epochs,"epochs_dd",1, ...[m
-[32m+[m[32m "len_tr",len_tr,"mu_dd",mu_ml,"mu_tr",mu_ml,"order",11,"sps",1, ...[m
-[32m+[m[32m "traceback_depth",128,"L",3,"delta",4,"adaptive_mu",0);[m
-[32m+[m
-[32m+[m[32m[ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode);[m
-[32m+[m[32mml_mlse_results.metrics.print("description",'ML ');[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_optimize.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_optimize.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..5d5b4f9[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_optimize.m[m
-[36m@@ -0,0 +1,177 @@[m
-[32m+[m[32mfunction BER = first_analysis_optimize(baud_rate, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength)[m
-[32m+[m[32m %%[m
-[32m+[m[32m base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\Sweep Data\";[m
-[32m+[m[32m mode = 0; %0 oder 1[m
-[32m+[m[32m % M = 2;[m
-[32m+[m[41m [m
-[32m+[m[32m all_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, baud_rate + "G_PAM4\tx_info\tx_info_PAM4_" + baud_rate + "Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m tx_data = load(tx_data_path);[m
-[32m+[m[32m datas = load(filename);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m str = filename;[m
-[32m+[m[32m M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m assert(M==M_);[m
-[32m+[m[32m fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m % Tx data[m
-[32m+[m[41m [m
-[32m+[m[32m Bits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32m Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m 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[m
-[32m+[m[32m PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m[41m [m
-[32m+[m[32m Symbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32m assert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m[41m [m
-[32m+[m[32m Bits_ = PM.demap(Symbols);[m
-[32m+[m[32m [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32m assert(ber == 0);[m
-[32m+[m[41m [m
-[32m+[m[32m %% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32m Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Digi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32m MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Rx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx Data[m
-[32m+[m[32m traceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m[41m [m
-[32m+[m[32m %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32m scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32m demystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32m assert(demystified);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32m Scope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m[41m [m
-[32m+[m[32m % 1) matched filter[m
-[32m+[m[32m % pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m % It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m % -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32m Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32m Rx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32m Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m[41m [m
-[32m+[m[32m % timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m % try to do this with 2sps EQ![m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32m Rx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_Time_Rec = Rx_matched;[m
-[32m+[m[32m % Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1);[m
-[32m+[m[41m [m
-[32m+[m[32m Time_Rec = 1;[m
-[32m+[m[32m if Time_Rec[m
-[32m+[m[32m [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);[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32m else[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m baud_rate_num = str2double(baud_rate);[m
-[32m+[m[32m Rx_Time_Rec.fs = baud_rate_num*10^9;[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9);[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx_matched_1.plot("fignum",231231)[m
-[32m+[m[32m % Rx_Time_Rec.plot("fignum",231231)[m
-[32m+[m[41m [m
-[32m+[m[32m %% not working..[m[41m [m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m len_tr = trlength;[m
-[32m+[m[32m mu_ffe1 = 0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.004;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m mu_dfe = 0.0004;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32m Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m % eq_ffe = EQ("Ne",[400, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m % "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m % "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m % "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % % ffe_results.metrics.print[m
-[32m+[m[32m % fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % BER_value = ffe_results.metrics.BER;[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[41m [m
-[32m+[m[32m pf_ncoeffs = num_pf_coeff;[m
-[32m+[m[32m eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m[41m [m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m[41m [m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m fprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m BER = mlse_results.metrics.BER;[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m % ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ...[m
-[32m+[m[32m % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",1, ...[m
-[32m+[m[32m % "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m % fprintf('ML-based MLSE:\n');[m
-[32m+[m[32m % fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..22622ec[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec.m[m
-[36m@@ -0,0 +1,160 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 4;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32mScope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32mScope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mMatched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32mRx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32mRx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m
-[32m+[m[32m% timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% try to do this with 2sps EQ![m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m[32m% Rx_Time_Rec = Rx_matched;[m
-[32m+[m[32m% Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1);[m
-[32m+[m[32m[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);[m
-[32m+[m
-[32m+[m[32m%% not working..[m[41m [m
-[32m+[m[32mRx_synced = Rx_Time_Rec;[m
-[32m+[m[32m% Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32mlen_tr = 4096*2;[m
-[32m+[m[32mmu_ffe1 = 0.0001;[m
-[32m+[m[32mmu_ffe2 = 0.0008;[m
-[32m+[m[32mmu_ffe3 = 0.001;[m
-[32m+[m[32mmu_dc = 0.004;[m
-[32m+[m[32mmu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m[32msps = 1;[m
-[32m+[m
-[32m+[m[32mRx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32mRx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m
-[32m+[m[32mDigi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% -------------------- FFE --------------------[m
-[32m+[m[32m% % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m% eq_ffe = EQ("Ne",[50, 5, 5],"Nb",[2,0,0], ...[m
-[32m+[m[32m% "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m% "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m% "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m% "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% % ffe_results.metrics.print[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m% BER_value = ffe_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m%% -------------------- VNLE + MLSE --------------------[m
-[32m+[m
-[32m+[m[32mpf_ncoeffs = 1;[m
-[32m+[m[32meq_v = EQ("Ne",[200, 3, 2],"Nb",[5, 2, 1], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32mpf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32mmlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32mmlse_results.metrics.print[m
-[32m+[m[32mfprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m
-[32m+[m[32m%% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m% ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ...[m
-[32m+[m[32m% "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",1, ...[m
-[32m+[m[32m% "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m% fprintf('ML-based MLSE:\n');[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..e681f2e[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam2.m[m
-[36m@@ -0,0 +1,171 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 2;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32mScope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32mScope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mMatched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32mRx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32mRx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m
-[32m+[m[32m% timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% try to do this with 2sps EQ![m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m[32mTime_Rec = 1;[m
-[32m+[m[32mif Time_Rec[m
-[32m+[m[32m [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);[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32melse[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif Time_Rec == 1 && M == 2[m[41m [m
-[32m+[m[32m Rx_Time_Rec.fs = 14e9;[m
-[32m+[m[32melseif Time_Rec == 1 && M == 4[m
-[32m+[m[32m Rx_Time_Rec.fs = 6e9;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% not working..[m[41m [m
-[32m+[m[32mRx_synced = Rx_Time_Rec;[m
-[32m+[m[32m% Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32mlen_tr = 4096*4;[m
-[32m+[m[32mmu_ffe1 = 0.0001;[m
-[32m+[m[32mmu_ffe2 = 0.0008;[m
-[32m+[m[32mmu_ffe3 = 0.001;[m
-[32m+[m[32mmu_dc = 0.004;[m
-[32m+[m[32mmu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m[32msps = 1;[m
-[32m+[m
-[32m+[m[32mRx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32mRx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m
-[32m+[m[32mDigi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% -------------------- FFE --------------------[m
-[32m+[m[32m% % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m% eq_ffe = EQ("Ne",[200, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m% "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m% "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m% "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% % ffe_results.metrics.print[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m% BER_value = ffe_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m%% -------------------- VNLE + MLSE --------------------[m
-[32m+[m
-[32m+[m[32mpf_ncoeffs = 4;[m
-[32m+[m[32meq_v = EQ("Ne",[250, 0, 0],"Nb",[7, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",0, ...[m
-[32m+[m[32m 'weighted_DFE',1,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','I2','weighted_DFE_I_mode',[5,0.5,0.6]);[m
-[32m+[m[32mpf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32mmlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32mmlse_results.metrics.print[m
-[32m+[m[32mfprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m
-[32m+[m[32m%% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m% ml_mlse_equalizer = ML_MLSE("epochs_tr",400,"epochs_dd",1, ...[m
-[32m+[m[32m% "len_tr",len_tr,"mu_dd",0.03,"mu_tr",0.03,"order",100,"sps",sps, ...[m
-[32m+[m[32m% "traceback_depth",256,"L",2,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m% fprintf('ML-based MLSE:\n');[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..2881ccf[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam4.m[m
-[36m@@ -0,0 +1,189 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\Sweep Data\";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 4;[m
-[32m+[m
-[32m+[m[32mbaud_rate = '8';[m
-[32m+[m[32mbaud_rate_num = str2double(baud_rate);[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, baud_rate + "G_PAM2\tx_info\tx_info_PAM2_" + baud_rate + "Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, baud_rate + "G_PAM4\tx_info\tx_info_PAM4_" + baud_rate + "Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32mScope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32mScope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mMatched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32mRx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32mRx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m
-[32m+[m[32m% timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% try to do this with 2sps EQ![m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m[32m% Rx_Time_Rec = Rx_matched;[m
-[32m+[m[32m% Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1);[m
-[32m+[m
-[32m+[m[32mTime_Rec = 1;[m
-[32m+[m[32mif Time_Rec[m
-[32m+[m[32m [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);[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32melse[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec.fs = baud_rate_num * 10^9;[m
-[32m+[m
-[32m+[m[32m% Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9);[m
-[32m+[m
-[32m+[m[32m% Rx_matched_1.plot("fignum",231231)[m
-[32m+[m[32m% Rx_Time_Rec.plot("fignum",231231)[m
-[32m+[m
-[32m+[m[32m%% not working..[m[41m [m
-[32m+[m[32mRx_synced = Rx_Time_Rec;[m
-[32m+[m[32m% Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32mlen_tr = 4096*2;[m
-[32m+[m[32mmu_ffe1 = 0.0001;[m
-[32m+[m[32mmu_ffe2 = 0.0008;[m
-[32m+[m[32mmu_ffe3 = 0.001;[m
-[32m+[m[32mmu_dc = 0.004;[m
-[32m+[m[32mmu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32mRx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32mRx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m
-[32m+[m[32mDigi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% -------------------- FFE --------------------[m
-[32m+[m[32m% % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m% eq_ffe = EQ("Ne",[400, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m% "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m% "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m% "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% % ffe_results.metrics.print[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m% BER_value = ffe_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m%% -------------------- VNLE + MLSE --------------------[m
-[32m+[m
-[32m+[m[32mpf_ncoeffs = 4;[m
-[32m+[m[32meq_v = EQ("Ne",[300, 0, 0],"Nb",[0, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32mpf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32mmlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32mmlse_results.metrics.print[m
-[32m+[m[32mfprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m
-[32m+[m[32m%% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m% ml_mlse_equalizer = ML_MLSE("epochs_tr",200,"epochs_dd",1, ...[m
-[32m+[m[32m% "len_tr",length(Rx_synced)/2,"mu_dd",0,"mu_tr",0.03,"order",100,"sps",sps, ...[m
-[32m+[m[32m% "traceback_depth",256,"L",3,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m% fprintf('ML-based MLSE:\n');[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m
-[32m+[m[32m%% -------------------- DB target --------------------[m
-[32m+[m[32m% mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% eq_ = EQ("Ne",[50, 5, 5],"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m% "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% dbt_results.metrics.print("description",'Duobinary');[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',dbt_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_shift.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_shift.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..162d6a6[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_shift.m[m
-[36m@@ -0,0 +1,221 @@[m
-[32m+[m[32mfunction BER = first_analysis_time_shift(time_shift)[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32m mode = 0; %0 oder 1[m
-[32m+[m[32m M = 4;[m
-[32m+[m[41m [m
-[32m+[m[32m all_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m[41m [m
-[32m+[m[32m % data_tr_mf is the already recovered and filtered data[m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m tx_data = load(tx_data_path);[m
-[32m+[m[32m datas = load(filename);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m str = filename;[m
-[32m+[m[32m M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m assert(M==M_);[m
-[32m+[m[32m fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32m pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32m mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[32m % Tx data[m
-[32m+[m[41m [m
-[32m+[m[32m Bits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32m Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m 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[m
-[32m+[m[32m PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m[41m [m
-[32m+[m[32m Symbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32m assert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m[41m [m
-[32m+[m[32m Bits_ = PM.demap(Symbols);[m
-[32m+[m[32m [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32m assert(ber == 0);[m
-[32m+[m[41m [m
-[32m+[m[32m %% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32m Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Digi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32m MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32m Rx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m[41m [m
-[32m+[m[32m %%[m
-[32m+[m[41m [m
-[32m+[m[32m % Rx Data[m
-[32m+[m[32m traceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m[41m [m
-[32m+[m[32m %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32m scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32m demystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32m assert(demystified);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m[41m [m
-[32m+[m[32m Scope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32m Scope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m[41m [m
-[32m+[m[32m % 1) matched filter[m
-[32m+[m[32m % pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m % It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m % -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32m Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32m Rx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32m Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m[41m [m
-[32m+[m[32m data_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym);[m
-[32m+[m[41m [m
-[32m+[m[32m % timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m % try to do this with 2sps EQ![m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32m Rx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m[32m Rx_matched_original = Rx_synced_cell{1};[m
-[32m+[m[32m Rx_matched_original.signal = resample(Rx_matched_original.signal,1,2);[m
-[32m+[m[41m [m
-[32m+[m[32m [~,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);[m
-[32m+[m[32m Rx_tr_mf = Rx_synced_cell_tr_mf{1};[m
-[32m+[m[41m [m
-[32m+[m[32m Time_Rec = 1;[m
-[32m+[m[32m if Time_Rec[m
-[32m+[m[32m % [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);[m
-[32m+[m[32m Rx_Time_Rec = Time_Shifter('value',time_shift).process(Rx_matched_1);[m
-[32m+[m[32m Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal,1,2);[m
-[32m+[m[32m % figure(2222222)[m
-[32m+[m[32m % plot(Timing_Error)[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32m else[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m if Time_Rec == 1 && M == 2[m[41m [m
-[32m+[m[32m Rx_Time_Rec.fs = 14e9;[m
-[32m+[m[32m elseif Time_Rec == 1 && M == 4[m
-[32m+[m[32m Rx_Time_Rec.fs = 6e9;[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_Time_Rec.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111);[m
-[32m+[m[32m % Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111);[m
-[32m+[m[32m Rx_tr_mf.spectrum('normalizeTo0dB',1,"displayname",'Their signal','fignum',101111);[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_Time_Rec_plot = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_matched_original_plot = Rx_matched_original;[m
-[32m+[m[32m Rx_tr_mf_plot = Rx_tr_mf;[m
-[32m+[m[32m Rx_Time_Rec_plot.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311);[m
-[32m+[m[32m % Rx_matched_original_plot.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311);[m
-[32m+[m[32m Rx_tr_mf_plot.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311);[m
-[32m+[m[41m [m
-[32m+[m[32m %% not working..[m[41m [m
-[32m+[m[32m % Use our or their signal[m
-[32m+[m[32m for our_signal = 1[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m else[m
-[32m+[m[32m Rx_synced = Rx_tr_mf;[m
-[32m+[m[32m end[m
-[32m+[m[32m % Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m len_tr = 4096*2;[m
-[32m+[m[32m mu_ffe1 = 0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.004;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m mu_dfe = 0.0004;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32m Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m % eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m % "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m % "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m % "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[32m pf_ncoeffs = 4;[m
-[32m+[m[32m eq_v = EQ("Ne",[100, 0, 0],"Nb",[0, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ...[m
-[32m+[m[32m 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]);[m
-[32m+[m[32m % eq_v = FFE_DFE('ffe_order',200,'dfe_order',0,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ...[m
-[32m+[m[32m % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m[41m [m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m[41m [m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m else[m
-[32m+[m[32m fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m end[m
-[32m+[m[32m BER = mlse_results.metrics.BER;[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ...[m
-[32m+[m[32m % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ...[m
-[32m+[m[32m % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..fe8f371[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf.m[m
-[36m@@ -0,0 +1,271 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mclear all;[m
-[32m+[m[32mclose all;[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 4;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32m% data_tr_mf is the already recovered and filtered data[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_compare = Pform.process(Symbols);[m
-[32m+[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32mScope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32mScope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m%Calculate Transfer Function[m
-[32m+[m[32mTx_spectrum = Digi_sig_compare;[m
-[32m+[m[32mRx_spectrum = Scope_sig;[m
-[32m+[m
-[32m+[m[32m[~,Rx_synced_spectrum,inverted_spectrum,sequenceFound_spectrum,sequenceStarts_spectrum] = Rx_spectrum.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_spectrum = Rx_synced_spectrum{1};[m
-[32m+[m
-[32m+[m[32mTx_spectrum = Tx_spectrum.resample("fs_out",fsym);[m
-[32m+[m[32mTx_spectrum.signal = fft(Tx_spectrum.signal);[m
-[32m+[m
-[32m+[m[32mRx_spectrum = Rx_spectrum.resample("fs_out",fsym);[m
-[32m+[m[32mRx_spectrum.signal = fft(Rx_spectrum.signal);[m
-[32m+[m
-[32m+[m[32mH_transfer = Rx_spectrum.signal./Tx_spectrum.signal;[m
-[32m+[m[32mH_inv = 1./H_transfer;[m
-[32m+[m
-[32m+[m[32m%Number of Samples/Symbol after Matched Filter[m
-[32m+[m[32mKov = 14;[m
-[32m+[m
-[32m+[m[32mScope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym);[m
-[32m+[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mMatched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32mRx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32mRx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m[32m% Rx_matched = Scope_sig;[m
-[32m+[m[32m% Rx_matched = Rx_matched.resample('fs_out',Kov*fsym);[m
-[32m+[m
-[32m+[m[32mdata_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym);[m
-[32m+[m[32m[~,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);[m
-[32m+[m[32mRx_tr_mf = Rx_synced_cell_tr_mf{1};[m
-[32m+[m
-[32m+[m[32m% timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% try to do this with 2sps EQ![m
-[32m+[m
-[32m+[m[32m% Rx_matched = Scope_sig;[m
-[32m+[m[32m% Rx_matched = Rx_matched.resample("fs_out",2*fsym);[m
-[32m+[m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m[32mRx_matched_original = Rx_synced_cell{1};[m
-[32m+[m[32mRx_matched_original.signal = resample(Rx_matched_original.signal,1,Kov);[m
-[32m+[m[32mRx_matched_original.fs = fsym;[m
-[32m+[m
-[32m+[m[32m% Rx_matched_1 = Rx_matched_1.resample("fs_in",Kov*fsym,'fs_out',2*fsym);[m
-[32m+[m
-[32m+[m[32mTime_Rec = 1;[m
-[32m+[m[32mif Time_Rec[m
-[32m+[m[32m % [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);[m
-[32m+[m
-[32m+[m[32m [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);[m
-[32m+[m[32m Rx_Time_Rec = Rx_Time_Rec.resample('fs_in',Kov*fsym,'fs_out',fsym);[m
-[32m+[m
-[32m+[m[32m % 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);[m
-[32m+[m[41m [m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32melse[m
-[32m+[m[32m Rx_Time_Rec = Rx_matched_1;[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec.fs = fsym;[m
-[32m+[m
-[32m+[m[32m% h = gaussdesign(0.4,64,1);[m
-[32m+[m[32m% Rx_Time_Rec.signal = filtfilt(h,1,Rx_Time_Rec.signal);[m
-[32m+[m
-[32m+[m[32m% Rx_com = Rx_Time_Rec;[m
-[32m+[m[32m% Rx_com = Rx_com.resample('fs_in',fsym,'fs_out',2*fsym);[m
-[32m+[m[32m% Rx_com.spectrum("displayname",'After TR','normalizeTo0dB',1,'fignum',101114);[m
-[32m+[m[32m% Rx_matched_1.spectrum("displayname",'Before TR','normalizeTo0dB',1,'fignum',101114);[m
-[32m+[m[32m% Rx_tr_mf_2sps = Rx_tr_mf;[m
-[32m+[m[32m% Rx_tr_mf_2sps = Rx_tr_mf_2sps.resample('fs_in',fsym,'fs_out',2*fsym);[m
-[32m+[m[32m% Rx_tr_mf_2sps.spectrum("displayname",'Their signal after TR','normalizeTo0dB',1,'fignum',101114);[m
-[32m+[m
-[32m+[m[32m% Rx_Time_Rec = Rx_Time_Rec.resample('fs_out',6e9);[m
-[32m+[m[32m% Rx_tr_mf = Rx_tr_mf.resample('fs_out',fsym);[m
-[32m+[m
-[32m+[m[32m% Amax = 10;[m
-[32m+[m[32m% H_inv = min(abs(H_inv), Amax) .* exp(1j*angle(H_inv));[m
-[32m+[m[32m% Rx_Time_Rec.signal = fft(Rx_Time_Rec.signal);[m
-[32m+[m[32m% Rx_Time_Rec.signal = ifft(Rx_Time_Rec.signal .* H_inv);[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec = Rx_Time_Rec.normalize('mode','rms');[m
-[32m+[m[32mRx_tr_mf = Rx_tr_mf.normalize('mode','rms');[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec.spectrum("displayname",'Our signal','normalizeTo0dB',1,'fignum',101111);[m
-[32m+[m[32m% Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111);[m
-[32m+[m[32mRx_tr_mf.spectrum("displayname",'Their signal','normalizeTo0dB',1,'fignum',101111);[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311);[m
-[32m+[m[32m% Rx_matched_original.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311);[m
-[32m+[m[32mRx_tr_mf.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311);[m
-[32m+[m
-[32m+[m[32m%% not working..[m[41m [m
-[32m+[m[32m% Use our or their signal[m
-[32m+[m[32mfor our_signal = 1[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m else[m
-[32m+[m[32m Rx_synced = Rx_tr_mf;[m
-[32m+[m[32m end[m
-[32m+[m[32m % Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m len_tr = 4096*2;[m
-[32m+[m[32m mu_ffe1 = 0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.004;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m mu_dfe = 0.0004;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32m Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m % eq_ffe = EQ("Ne",[150, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m % "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m % "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m % "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[32m pf_ncoeffs = 4;[m
-[32m+[m[32m eq_v = EQ("Ne",[300, 0, 0],"Nb",[0, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ...[m
-[32m+[m[32m 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]);[m
-[32m+[m[32m % eq_v = FFE_DFE('ffe_order',300,'dfe_order',5,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ...[m
-[32m+[m[32m % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m else[m
-[32m+[m[32m fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ...[m
-[32m+[m[32m % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ...[m
-[32m+[m[32m % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..e6f4c45[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam2.m[m
-[36m@@ -0,0 +1,195 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 2;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m % Already recovered and filtered data[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_compare = Pform.process(Symbols);[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32mScope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32mScope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mMatched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32mRx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32mRx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m
-[32m+[m[32mdata_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym);[m
-[32m+[m
-[32m+[m[32m% timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% try to do this with 2sps EQ![m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m[32m[~,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);[m
-[32m+[m[32mRx_tr_mf = Rx_synced_cell_tr_mf{1};[m
-[32m+[m
-[32m+[m
-[32m+[m[32mTime_Rec = 1;[m
-[32m+[m[32mif Time_Rec[m
-[32m+[m[32m [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);[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32melse[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif Time_Rec == 1 && M == 2[m[41m [m
-[32m+[m[32m Rx_Time_Rec.fs = 14e9;[m
-[32m+[m[32melseif Time_Rec == 1 && M == 4[m
-[32m+[m[32m Rx_Time_Rec.fs = 6e9;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec.spectrum("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101111);[m
-[32m+[m[32mRx_tr_mf.spectrum("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101111);[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec_plot = Rx_Time_Rec;[m
-[32m+[m[32mRx_tr_mf_plot = Rx_tr_mf;[m
-[32m+[m[32mRx_Time_Rec_plot.normalize("mode","rms").plot("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101311);[m
-[32m+[m[32mRx_tr_mf_plot.normalize("mode","rms").plot("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101311);[m
-[32m+[m
-[32m+[m[32m%% not working..[m[41m [m
-[32m+[m[32m% Use our or their signal[m
-[32m+[m[32mour_signal = 0;[m
-[32m+[m[32mif our_signal[m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32melse[m
-[32m+[m[32m Rx_synced = Rx_tr_mf;[m
-[32m+[m[32mend[m
-[32m+[m[32m% Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m% Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32mlen_tr = 4096*2;[m
-[32m+[m[32mmu_ffe1 = 0.0001;[m
-[32m+[m[32mmu_ffe2 = 0.0008;[m
-[32m+[m[32mmu_ffe3 = 0.001;[m
-[32m+[m[32mmu_dc = 0.004;[m
-[32m+[m[32mmu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m[32msps = 1;[m
-[32m+[m
-[32m+[m[32mRx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32mRx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m
-[32m+[m[32mDigi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32mRx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% -------------------- FFE --------------------[m
-[32m+[m[32m% % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m% eq_ffe = EQ("Ne",[200, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m% "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m% "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m% "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% % ffe_results.metrics.print[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m% BER_value = ffe_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m%% -------------------- VNLE + MLSE --------------------[m
-[32m+[m
-[32m+[m[32mpf_ncoeffs = 4;[m
-[32m+[m[32meq_v = EQ("Ne",[200, 0, 0],"Nb",[0, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ...[m
-[32m+[m[32m 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','I2','weighted_DFE_I_mode',[5,0.5,0.6]);[m
-[32m+[m[32mpf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32mmlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32mmlse_results.metrics.print[m
-[32m+[m[32mfprintf('My EQ: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m
-[32m+[m[32m%% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m% ml_mlse_equalizer = ML_MLSE("epochs_tr",400,"epochs_dd",1, ...[m
-[32m+[m[32m% "len_tr",len_tr,"mu_dd",0.03,"mu_tr",0.03,"order",100,"sps",sps, ...[m
-[32m+[m[32m% "traceback_depth",256,"L",2,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m% fprintf('ML-based MLSE:\n');[m
-[32m+[m[32m% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m% fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..d27d6e1[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam_2.m[m
-[36m@@ -0,0 +1,272 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mclear all;[m
-[32m+[m[32mclose all;[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 2;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32m% data_tr_mf is the already recovered and filtered data[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_compare = Pform.process(Symbols);[m
-[32m+[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32mScope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32mScope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m%Calculate Transfer Function[m
-[32m+[m[32mTx_spectrum = Digi_sig_compare;[m
-[32m+[m[32mRx_spectrum = Scope_sig;[m
-[32m+[m
-[32m+[m[32m[~,Rx_synced_spectrum,inverted_spectrum,sequenceFound_spectrum,sequenceStarts_spectrum] = Rx_spectrum.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_spectrum = Rx_synced_spectrum{1};[m
-[32m+[m
-[32m+[m[32mTx_spectrum = Tx_spectrum.resample("fs_out",fsym);[m
-[32m+[m[32mTx_spectrum.signal = fft(Tx_spectrum.signal);[m
-[32m+[m
-[32m+[m[32mRx_spectrum = Rx_spectrum.resample("fs_out",fsym);[m
-[32m+[m[32mRx_spectrum.signal = fft(Rx_spectrum.signal);[m
-[32m+[m
-[32m+[m[32mH_transfer = Rx_spectrum.signal./Tx_spectrum.signal;[m
-[32m+[m[32mH_inv = 1./H_transfer;[m
-[32m+[m
-[32m+[m[32m%Number of Samples/Symbol after Matched Filter[m
-[32m+[m[32mKov = 14;[m
-[32m+[m
-[32m+[m[32mScope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym);[m
-[32m+[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mMatched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32mRx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32mRx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m[32m% Rx_matched = Scope_sig;[m
-[32m+[m[32m% Rx_matched = Rx_matched.resample('fs_out',Kov*fsym);[m
-[32m+[m
-[32m+[m[32mdata_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym);[m
-[32m+[m[32m[~,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);[m
-[32m+[m[32mRx_tr_mf = Rx_synced_cell_tr_mf{1};[m
-[32m+[m
-[32m+[m[32m% timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% try to do this with 2sps EQ![m
-[32m+[m
-[32m+[m[32m% Rx_matched = Scope_sig;[m
-[32m+[m[32m% Rx_matched = Rx_matched.resample("fs_out",2*fsym);[m
-[32m+[m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m[32mRx_matched_original = Rx_synced_cell{1};[m
-[32m+[m[32mRx_matched_original.signal = resample(Rx_matched_original.signal,1,Kov);[m
-[32m+[m[32mRx_matched_original.fs = fsym;[m
-[32m+[m
-[32m+[m[32m% Rx_matched_1 = Rx_matched_1.resample("fs_in",Kov*fsym,'fs_out',2*fsym);[m
-[32m+[m
-[32m+[m[32mTime_Rec = 1;[m
-[32m+[m[32mif Time_Rec[m
-[32m+[m[32m % [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);[m
-[32m+[m[32m % Rx_matched_1.spectrum('normalizeTo0dB',1,"displayname",'Signal before Timing Recovery','fignum',1023);[m
-[32m+[m[32m % [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);[m
-[32m+[m[32m 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);[m
-[32m+[m[32m % Rx_Time_Rec.spectrum('normalizeTo0dB',1,"displayname",'Signal after Timing Recovery','fignum',1023);[m
-[32m+[m[32m % idx = 1:2:length(Rx_Time_Rec);[m
-[32m+[m[32m % Rx_Time_Rec.signal = Rx_Time_Rec.signal(idx);[m
-[32m+[m[32m % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal,1,Kov);[m
-[32m+[m[32m % Rx_Time_Rec = Rx_matched_1;[m
-[32m+[m[32m % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal,1,Kov);[m
-[32m+[m[32m % figure(2222222)[m
-[32m+[m[32m % plot(Timing_Error)[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32melse[m
-[32m+[m[32m Rx_Time_Rec = Rx_matched_1;[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32mend[m
-[32m+[m[32mRx_Time_Rec.fs = fsym;[m
-[32m+[m
-[32m+[m[32mRx_com = Rx_Time_Rec;[m
-[32m+[m[32mRx_com = Rx_com.resample('fs_in',fsym,'fs_out',2*fsym);[m
-[32m+[m[32mRx_com.spectrum("displayname",'After TR','normalizeTo0dB',1,'fignum',101114);[m
-[32m+[m[32mRx_matched_1.spectrum("displayname",'Before TR','normalizeTo0dB',1,'fignum',101114);[m
-[32m+[m[32mRx_tr_mf_2sps = Rx_tr_mf;[m
-[32m+[m[32mRx_tr_mf_2sps = Rx_tr_mf_2sps.resample('fs_in',fsym,'fs_out',2*fsym);[m
-[32m+[m[32mRx_tr_mf_2sps.spectrum("displayname",'Their signal after TR','normalizeTo0dB',1,'fignum',101114);[m
-[32m+[m
-[32m+[m[32m% Rx_Time_Rec = Rx_Time_Rec.resample('fs_out',6e9);[m
-[32m+[m[32m% Rx_tr_mf = Rx_tr_mf.resample('fs_out',fsym);[m
-[32m+[m
-[32m+[m[32m% Amax = 10;[m
-[32m+[m[32m% H_inv = min(abs(H_inv), Amax) .* exp(1j*angle(H_inv));[m
-[32m+[m[32m% Rx_Time_Rec.signal = fft(Rx_Time_Rec.signal);[m
-[32m+[m[32m% Rx_Time_Rec.signal = ifft(Rx_Time_Rec.signal .* H_inv);[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec = Rx_Time_Rec.normalize('mode','rms');[m
-[32m+[m[32mRx_tr_mf = Rx_tr_mf.normalize('mode','rms');[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111);[m
-[32m+[m[32m% Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111);[m
-[32m+[m[32mRx_tr_mf.spectrum('normalizeTo0dB',1,"displayname",'Their signal','fignum',101111);[m
-[32m+[m
-[32m+[m[32mRx_Time_Rec.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311);[m
-[32m+[m[32m% Rx_matched_original.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311);[m
-[32m+[m[32mRx_tr_mf.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311);[m
-[32m+[m
-[32m+[m[32m%% not working..[m[41m [m
-[32m+[m[32m% Use our or their signal[m
-[32m+[m[32mfor our_signal = 1[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m else[m
-[32m+[m[32m Rx_synced = Rx_tr_mf;[m
-[32m+[m[32m end[m
-[32m+[m[32m % Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m len_tr = 4096*2;[m
-[32m+[m[32m mu_ffe1 = 0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.004;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m mu_dfe = 0.0004;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32m Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m % eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m % "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m % "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m % "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[32m pf_ncoeffs = 4;[m
-[32m+[m[32m eq_v = EQ("Ne",[250, 0, 0],"Nb",[0, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ...[m
-[32m+[m[32m 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]);[m
-[32m+[m[32m % eq_v = FFE_DFE('ffe_order',200,'dfe_order',0,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ...[m
-[32m+[m[32m % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m else[m
-[32m+[m[32m fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ...[m
-[32m+[m[32m % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ...[m
-[32m+[m[32m % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/Evaluation Scripts/ml_mlse_complexity_plot.m b/projects/FSO_transmission/Evaluation Scripts/ml_mlse_complexity_plot.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..d30035b[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/ml_mlse_complexity_plot.m[m
-[36m@@ -0,0 +1,11 @@[m
-[32m+[m[32mN = 1:4;[m
-[32m+[m[32mS = 4;[m
-[32m+[m[32mL = 1:4;[m
-[32m+[m[32mComplexity_N = (N+1).*S.^(1+1);[m
-[32m+[m[32mComplexity_L = (1+1).*S.^(L+1);[m
-[32m+[m
-[32m+[m[32mfigure;[m
-[32m+[m[32mplot(N,Complexity_N)[m
-[32m+[m[32mhold on[m
-[32m+[m[32mplot(L,Complexity_L)[m
-[32m+[m[32mhold off[m
-[1mdiff --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[m
-[1mnew file mode 100644[m
-[1mindex 0000000..ae3a1b5[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/Evaluation Scripts/plotscript_baud_rate_sweep_method.m[m
-[36m@@ -0,0 +1,36 @@[m
-[32m+[m[32mx = 4:8;[m
-[32m+[m[32mfor method = 1:4[m
-[32m+[m[32m 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']);[m
-[32m+[m[32m data = load(filename);[m
-[32m+[m[32m BER = data.BER_PAM_4;[m
-[32m+[m[32m figure(22113344)[m
-[32m+[m[32m plot(x,BER,'-o','LineWidth',1.75);[m
-[32m+[m[32m hold on[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mh1 = yline(2e-2, ':k', 'LineWidth',1.5);[m
-[32m+[m[32mh2 = yline(3.8e-3,':b', 'LineWidth',1.5);[m
-[32m+[m[32mh3 = yline(4.85e-3,':g', 'LineWidth',1.5);[m
-[32m+[m[32mh4 = yline(2.2e-4,':r', 'LineWidth',1.5);[m
-[32m+[m
-[32m+[m[32m% Legende NUR für Kurven[m
-[32m+[m[32mlegend('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',...[m
-[32m+[m[32m 'Interpreter','latex', ...[m
-[32m+[m[32m 'Location','southeast', 'FontSize', 14)[m
-[32m+[m
-[32m+[m[32m% FEC Labels direkt im Plot[m
-[32m+[m[32mtext(6.85,2.3e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(7,3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex')[m
-[32m+[m[32mtext(7,5.6e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex')[m
-[32m+[m[32mtext(7,2.5e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mxlabel('Symbol Rate [GBd]', 'Interpreter','latex')[m
-[32m+[m[32mylabel('BER', 'Interpreter','latex')[m
-[32m+[m[32m% title('BER for PAM-4', 'Interpreter','latex')[m
-[32m+[m
-[32m+[m[32mgrid minor[m
-[32m+[m[32m% ylim([1e-4 5e-2])[m
-[32m+[m[32mxlim([3 9])[m
-[32m+[m[32mset(gca,'YScale','log')[m
-[32m+[m[32mhold off[m
-[32m+[m[32m% beautifyBERplot[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/FSO_timing_recovery_minimal_example.m b/projects/FSO_transmission/FSO_timing_recovery_minimal_example.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..36884ff[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/FSO_timing_recovery_minimal_example.m[m
-[36m@@ -0,0 +1,251 @@[m
-[32m+[m[32m%%[m
-[32m+[m[32mclear all;[m
-[32m+[m[32mclose all;[m
-[32m+[m
-[32m+[m[32m%% Choose a fitting base leading to the FSO Data[m
-[32m+[m[32mbase = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 4;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32m% data_tr_mf is the already recovered and filtered data[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat");[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mtx_data = load(tx_data_path);[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_compare = Pform.process(Symbols);[m
-[32m+[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32mScope_sig.plot("displayname",'raw','fignum',100);[m
-[32m+[m[32mScope_sig.spectrum("displayname",'raw','fignum',101)[m
-[32m+[m
-[32m+[m[32m%Calculate Transfer Function[m
-[32m+[m[32mTx_spectrum = Digi_sig_compare;[m
-[32m+[m[32mRx_spectrum = Scope_sig;[m
-[32m+[m
-[32m+[m[32m[~,Rx_synced_spectrum,inverted_spectrum,sequenceFound_spectrum,sequenceStarts_spectrum] = Rx_spectrum.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_spectrum = Rx_synced_spectrum{1};[m
-[32m+[m
-[32m+[m[32mTx_spectrum = Tx_spectrum.resample("fs_out",fsym);[m
-[32m+[m[32mTx_spectrum.signal = fft(Tx_spectrum.signal);[m
-[32m+[m
-[32m+[m[32mRx_spectrum = Rx_spectrum.resample("fs_out",fsym);[m
-[32m+[m[32mRx_spectrum.signal = fft(Rx_spectrum.signal);[m
-[32m+[m
-[32m+[m[32mH_transfer = Rx_spectrum.signal./Tx_spectrum.signal;[m
-[32m+[m[32mH_inv = 1./H_transfer;[m
-[32m+[m
-[32m+[m[32m%Number of Samples/Symbol after Matched Filter[m
-[32m+[m[32mKov = 14;[m
-[32m+[m
-[32m+[m[32mScope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym);[m
-[32m+[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef firectly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mMatched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32mRx_matched = Matched_Filter.process(Scope_sig);[m
-[32m+[m[32mRx_matched.spectrum("displayname",'Signal after matched filter','fignum',1);[m
-[32m+[m
-[32m+[m[32m% Loading and synchronizing their matched filtered and timing recovered data[m
-[32m+[m[32mdata_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym);[m
-[32m+[m[32m[~,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);[m
-[32m+[m[32mRx_tr_mf = Rx_synced_cell_tr_mf{1};[m
-[32m+[m
-[32m+[m[32m% Timing sync -> at this point we still have no symbol timing recovery, we[m
-[32m+[m[32m% try to do this with 2sps EQ![m
-[32m+[m[32m[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1);[m
-[32m+[m[32mRx_matched_1 = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m[32m% Timing recovery[m
-[32m+[m[32mTime_Rec = 1;[m
-[32m+[m[32mTiming_Mode = 3;[m
-[32m+[m[32mif Time_Rec[m
-[32m+[m[32m if Timing_Mode == 1 % Zero-Crossing/Gardner/Early-Late/Müller-Mueller Timing Recovery[m
-[32m+[m[32m [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);[m
-[32m+[m[32m elseif Timing_Mode == 2 % Godard Timing Recovery (resampling is required as the Godard timing recovery does not change the number of samples per symbol)[m
-[32m+[m[32m [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);[m
-[32m+[m[32m Rx_Time_Rec = Rx_Time_Rec.resample('fs_in',Kov*fsym,'fs_out',fsym);[m
-[32m+[m[32m elseif Timing_Mode == 3 % Maximum Variance Timing Recovery[m
-[32m+[m[32m 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);[m
-[32m+[m[32m end[m
-[32m+[m[32melse[m
-[32m+[m[32m Rx_Time_Rec = Rx_matched_1.resample('fs_in',Kov*fsym,'fs_out',fsym);[m
-[32m+[m[32mend[m
-[32m+[m[32msps = 1;[m
-[32m+[m[32mRx_Time_Rec.fs = fsym;[m
-[32m+[m
-[32m+[m[32m% % Compensate using the inverse transfer function[m
-[32m+[m[32m% Amax = 10;[m
-[32m+[m[32m% H_inv = min(abs(H_inv), Amax) .* exp(1j*angle(H_inv));[m
-[32m+[m[32m% Rx_Time_Rec.signal = fft(Rx_Time_Rec.signal);[m
-[32m+[m[32m% Rx_Time_Rec.signal = ifft(Rx_Time_Rec.signal .* H_inv);[m
-[32m+[m
-[32m+[m[32m% Normalization[m
-[32m+[m[32mRx_Time_Rec = Rx_Time_Rec.normalize('mode','rms');[m
-[32m+[m[32mRx_tr_mf = Rx_tr_mf.normalize('mode','rms');[m
-[32m+[m
-[32m+[m[32m% Compare spectra of our and their time signal[m
-[32m+[m[32mRx_Time_Rec.spectrum("displayname",'Our signal','normalizeTo0dB',1,'fignum',101111);[m
-[32m+[m[32m% Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111);[m
-[32m+[m[32mRx_tr_mf.spectrum("displayname",'Their signal','normalizeTo0dB',1,'fignum',101111);[m
-[32m+[m
-[32m+[m[32m% Compare our and their time signal[m
-[32m+[m[32mRx_Time_Rec.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311);[m
-[32m+[m[32m% Rx_matched_original.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311);[m
-[32m+[m[32mRx_tr_mf.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Use our or their signal[m
-[32m+[m[32mfor our_signal = 1[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m else[m
-[32m+[m[32m Rx_synced = Rx_tr_mf;[m
-[32m+[m[32m end[m
-[32m+[m[32m % Rx_synced = Rx_Time_Rec;[m
-[32m+[m[32m % Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m len_tr = 4096*2;[m
-[32m+[m[32m mu_ffe1 = 0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.004;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];[m
-[32m+[m[32m mu_dfe = 0.0004;[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m[41m [m
-[32m+[m[32m Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103);[m
-[32m+[m[32m Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104);[m
-[32m+[m[41m [m
-[32m+[m[32m Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[32m Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1);[m
-[32m+[m[41m [m
-[32m+[m[32m if M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32m elseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- FFE --------------------[m
-[32m+[m[32m % requires some more digging what is going on :-)[m[41m [m
-[32m+[m[32m % eq_ffe = EQ("Ne",[150, 0, 0],"Nb",[0,0,0], ...[m
-[32m+[m[32m % "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m % "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...[m
-[32m+[m[32m % "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[32m pf_ncoeffs = 4;[m
-[32m+[m[32m eq_v = EQ("Ne",[300, 0, 0],"Nb",[0, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ...[m
-[32m+[m[32m 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]);[m
-[32m+[m[32m % eq_v = FFE_DFE('ffe_order',300,'dfe_order',5,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ...[m
-[32m+[m[32m % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0);[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m
-[32m+[m[32m mlse_results.metrics.print[m
-[32m+[m[32m if our_signal[m
-[32m+[m[32m fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m else[m
-[32m+[m[32m fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m %% -------------------- ML-based MLSE (L=2) --------------------[m
-[32m+[m[32m % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ...[m
-[32m+[m[32m % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ...[m
-[32m+[m[32m % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0);[m
-[32m+[m[32m %[m[41m [m
-[32m+[m[32m % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m[32m % if our_signal[m
-[32m+[m[32m % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % else[m
-[32m+[m[32m % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER);[m
-[32m+[m[32m % fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m % end[m
-[32m+[m[32mend[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/FSO_transmission/first_analysis.m b/projects/FSO_transmission/first_analysis.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..9a327ab[m
-[1m--- /dev/null[m
-[1m+++ b/projects/FSO_transmission/first_analysis.m[m
-[36m@@ -0,0 +1,252 @@[m
-[32m+[m
-[32m+[m[32mbase = "C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC";[m
-[32m+[m[32mmode = 0; %0 oder 1[m
-[32m+[m[32mM = 2;[m
-[32m+[m
-[32m+[m[32mall_files = dir(fullfile(base, "**/*.mat"));[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m 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");[m
-[32m+[m[32m 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");[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif mode == 1[m
-[32m+[m[32m [f, p] = uigetfile(fullfile(base, "**/*.mat"));[m[41m [m
-[32m+[m[32m if f~=0[m
-[32m+[m[32m filename = fullfile(p,f);[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m
-[32m+[m[32mdatas = load(filename);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32mstr = filename;[m
-[32m+[m[32mM_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32massert(M==M_);[m
-[32m+[m[32mfsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mfs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mI = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mrop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mL = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f');[m
-[32m+[m[32mpulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mrolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once'));[m
-[32m+[m[32mmode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once'));[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% Tx data[m
-[32m+[m
-[32m+[m[32mBits = Informationsignal(tx_data.tx_data,"fs",fsym);[m
-[32m+[m[32mSymbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym);[m
-[32m+[m
-[32m+[m[32mmapping_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[m
-[32m+[m[32mPM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme[m
-[32m+[m
-[32m+[m[32mSymbols_ = PM.map(Bits) .* PM.scaling;[m
-[32m+[m[32massert(isequal(Symbols.signal,Symbols_.signal));[m
-[32m+[m
-[32m+[m[32mBits_ = PM.demap(Symbols);[m
-[32m+[m[32m[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal);[m
-[32m+[m[32massert(ber == 0);[m
-[32m+[m
-[32m+[m[32m%% For comparison, apply pulsef on Tx Symbols[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sig_tx_compare = Pform.process(Symbols);[m
-[32m+[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mDigi_sync = Pform.process(Symbols);[m
-[32m+[m
-[32m+[m[32mMF = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff);[m
-[32m+[m[32mRx_sig_compare = MF.process(Digi_sig_tx_compare);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m% Rx Data[m
-[32m+[m[32mtraceData = datas.tr.lastData(2).trace.ch3;[m
-[32m+[m
-[32m+[m[32m%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin[m
-[32m+[m[32mscoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin;[m
-[32m+[m[32mdemystified = isequal(traceData.YData,scoperead_volts);[m
-[32m+[m[32massert(demystified);[m
-[32m+[m
-[32m+[m[32mtimesig_compare = [0:1:datas.tr.lastData(1).trace.ch3.Points-1] ./ fs;[m
-[32m+[m[32mtimesig = datas.tr.lastData(1).trace.ch3.XData;[m
-[32m+[m[32massert(isequal(traceData.YData,scoperead_volts));[m
-[32m+[m
-[32m+[m[32mScope_sig = Electricalsignal(traceData.YData,"fs",fs);[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m[32m% 1) matched filter[m
-[32m+[m[32m% pulse is symmetric, hence we can use pulsef directly as matched filter.[m
-[32m+[m[32m% It feels off (bit I think correct) that the fsym is now the output freq.!![m
-[32m+[m[32m% -> output 2 sps to omit timing recovery!?[m
-[32m+[m[32mapply_matched_filter = 1;[m
-[32m+[m[32mk = 1;[m
-[32m+[m[32mif apply_matched_filter[m
-[32m+[m[41m [m
-[32m+[m[32m Pform = Pulseformer("fsym",fsym,"fdac",k*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);[m
-[32m+[m[32m Rx_matched = Pform.process(Scope_sig);[m
-[32m+[m[32melse[m
-[32m+[m
-[32m+[m[32m Rx_matched = Filter('filtdegree',4,"f_cutoff",fsym*0.5,"fs",Scope_sig.fs,"filterType",filtertypes.gaussian,"active",true).process(Scope_sig);[m
-[32m+[m[32m Rx_matched = Rx_matched.resample("fs_out",k*fsym);[m
-[32m+[m[32mend[m
-[32m+[m[32mRx_matched.spectrum();[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32mcoefficients = arburg(Rx_matched.signal,25);[m
-[32m+[m
-[32m+[m[32mfigure()[m
-[32m+[m[32m[h,w] = freqz(1,coefficients,Rx_matched.length,"whole",Rx_matched.fs);[m
-[32m+[m[32mh = h/max(abs(h));[m
-[32m+[m[32mhold on[m
-[32m+[m[32mw_ = (w - Rx_matched.fs/2);[m
-[32m+[m[32mplot(w_.*1e-9,20*log10(fftshift(abs(h))),'DisplayName',['Burg Coeffs: ', num2str(round(coefficients,2)), ' '],'LineWidth',2);[m
-[32m+[m
-[32m+[m[32m%% Timing Rec[m
-[32m+[m[32mapply_timing_rec = 1;[m
-[32m+[m[32mif apply_timing_rec[m
-[32m+[m[32m [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);[m
-[32m+[m[32m figure();plot(timing_error);[m
-[32m+[m[32m Rx_symbolsync.fs = fsym;[m
-[32m+[m[32m % Tsynch[m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_symbolsync.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0);[m
-[32m+[m[32m Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m sps = 1;[m
-[32m+[m[32melse[m
-[32m+[m[32m % Tsynch[m
-[32m+[m[32m [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0);[m
-[32m+[m[32m Rx_synced = Rx_synced_cell{1};[m
-[32m+[m[32m Rx_synced = Rx_synced.resample("fs_out",2*fsym);[m
-[32m+[m[32m sps = 2;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif M == 2[m
-[32m+[m[32m 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[m
-[32m+[m[32melseif M == 4[m
-[32m+[m[32m ber_in_paper = 10^(-2.5);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32mRx_synced = Rx_synced_cell{1};[m
-[32m+[m
-[32m+[m
-[32m+[m[32m% -------------------- FFE --------------------[m
-[32m+[m[32m% requires some more digging what is going on :-)[m
-[32m+[m[32meq_ffe = EQ("Ne",[50, 1, 1],"Nb",[2,0,0], ...[m
-[32m+[m[32m "training_length",512,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m
-[32m+[m[32mvars = logspace(-4,-3,36);[m
-[32m+[m
-[32m+[m[32mparfor i = 1:numel(vars)[m
-[32m+[m
-[32m+[m[32m len_tr = 4096;[m
-[32m+[m[32m mu_ffe1 = 0.01;% mus(i);%0.0001;[m
-[32m+[m[32m mu_ffe2 = 0.0008;[m
-[32m+[m[32m mu_ffe3 = 0.001;[m
-[32m+[m[32m mu_dc = 0.005;[m
-[32m+[m[32m mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3];[m
-[32m+[m[32m mu_dfe = vars(i);[m
-[32m+[m[32m duob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32m % requires some more digging what is going on :-)[m
-[32m+[m[32m eq_ffe_1 = EQ("Ne",[150, 1, 0],"Nb",[50,0,0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",0);[m
-[32m+[m
-[32m+[m[32m 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);[m
-[32m+[m[32m % 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);[m
-[32m+[m
-[32m+[m
-[32m+[m[32m ffe_results = ffe(eq_ffe_1,M,Rx_synced,Symbols,Bits, ...[m
-[32m+[m[32m "precode_mode",duob_mode,'showAnalysis',1,"postFFE",[], ...[m
-[32m+[m[32m "eth_style_symbol_mapping",mapping_style);[m
-[32m+[m
-[32m+[m[32m ffe_results.metrics.BER[m
-[32m+[m[32m bers(i) = ffe_results.metrics.BER;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mfigure();[m
-[32m+[m[32mplot(vars,bers);[m
-[32m+[m[32myline(ber_in_paper)[m
-[32m+[m[32mbeautifyBERplot();[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32mffe_results.metrics.print("description",'FFE');[m
-[32m+[m[32mfprintf('FFE: %.1e \n',ffe_results.metrics.BER);[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%% -------------------- VNLE + MLSE --------------------[m
-[32m+[m[32mlen_tr = 4096;[m
-[32m+[m[32mmu_ffe1 = 0.0001;% mus(i);%0.0001;[m
-[32m+[m[32mmu_ffe2 = 0.0008;[m
-[32m+[m[32mmu_ffe3 = 0.001;[m
-[32m+[m[32mmu_dc = 0.005;[m
-[32m+[m[32mmu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32mpf_ncoeffs = 4;[m
-[32m+[m
-[32m+[m[32mvars = 1:7;[m
-[32m+[m[32mbers = zeros(size(vars));[m
-[32m+[m[32mparfor i = 1:numel(vars)[m
-[32m+[m[41m [m
-[32m+[m[32m eqv = EQ("Ne",[200, 1, 0],"Nb",[2, 0, 0], ...[m
-[32m+[m[32m "training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...[m
-[32m+[m[32m "FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m[32m pf_ncoeffs = vars(i);[m
-[32m+[m[32m pf = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m[32m mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels);[m
-[32m+[m[32m [vnle_results, mlse_results] = vnle_postfilter_mlse(eqv, pf, mlse_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style);[m
-[32m+[m[32m fprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32m vnle_results.metrics.print("description",'VNLE');[m
-[32m+[m[32m mlse_results.metrics.print("description",'MLSE');[m
-[32m+[m[32m bers(i) = mlse_results.metrics.BER;[m
-[32m+[m[32mend[m
-[32m+[m[32m%%[m
-[32m+[m[32mfigure();hold on[m
-[32m+[m[32mplot(vars,bers_ffe,'DisplayName','FFE [200,0,0] + PF + MLSE');[m
-[32m+[m[32mplot(vars,bers_vnle,'DisplayName','VNLE [200,1,0] + PF + MLSE');[m
-[32m+[m[32mplot(vars,bers_vnledfe,'DisplayName','VNLE [200,1,0] + DFE [2] + PF + MLSE');[m
-[32m+[m[32mplot(vars,bers_vnledfe_ideal,'DisplayName','VNLE [200,1,0] + ideal DFE [2] + PF + MLSE');[m
-[32m+[m[32myline(ber_in_paper);[m
-[32m+[m[32myline([2e-2, 4.85e-3, 3.8e-3, 2,2e-4],'LineWidth',2,'Color',[0.8,0.8,0.8],'LineStyle',':','HandleVisibility','off');[m
-[32m+[m[32mylim([1e-5,0.1]);[m
-[32m+[m[32mbeautifyBERplot();[m
-[32m+[m
-[32m+[m[32m%% -------------------- DB target --------------------[m
-[32m+[m[32mmlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);[m
-[32m+[m
-[32m+[m[32meq_ = EQ("Ne",[50, 5, 5],"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);[m
-[32m+[m
-[32m+[m[32mdbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ...[m
-[32m+[m[32m "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style);[m
-[32m+[m
-[32m+[m[32mfprintf('Paper: %.1e \n \n',ber_in_paper);[m
-[32m+[m[32mdbt_results.metrics.print("description",'Duobinary');[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%[m
-[32m+[m
-[32m+[m[32m%ML-based MLSE (L=2)[m
-[32m+[m[32mmu_ml = 0.01; training_epochs = 100;[m
-[32m+[m[32mml_mlse_equalizer = ML_MLSE("epochs_tr",training_epochs,"epochs_dd",1, ...[m
-[32m+[m[32m "len_tr",len_tr,"mu_dd",mu_ml,"mu_tr",mu_ml,"order",11,"sps",1, ...[m
-[32m+[m[32m "traceback_depth",128,"L",3,"delta",4,"adaptive_mu",0);[m
-[32m+[m
-[32m+[m[32m[ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode);[m
-[32m+[m[32mml_mlse_results.metrics.print("description",'ML ');[m
-\ No newline at end of file[m
-[1mdiff --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[m
-[1mindex 21f881f..986fcdb 100644[m
-[1m--- a/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/Copy_of_FIGURE_WAVELENGTH.m[m
-[1m+++ b/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/Copy_of_FIGURE_WAVELENGTH.m[m
-[36m@@ -6,7 +6,7 @@[m [mdb = DBHandler("dataBase", "labor_highspeed", "type", database_type);[m
- [m
- pam_levels = [4, 6, 8]; % three tiles[m
- bitrate_set = 360e9;[m
-[31m-fiberL = 10;[m
-[32m+[m[32mfiberL = 2;[m
- [m
- fields = [[m
- db.getTableFieldNames('power_state_info');[m
-[36m@@ -96,7 +96,7 @@[m [mend[m
- %% ============================================================[m
- % PLOT — 1×3 (PAM-4, PAM-6, PAM-8)[m
- % ============================================================[m
-[31m-fig = figure(9110); clf;[m
-[32m+[m[32mfig = figure(9112); clf;[m
- tiledlayout(1,3,'TileSpacing','compact','Padding','compact');[m
- [m
- lw = 1.8;[m
-[36m@@ -223,19 +223,19 @@[m [mylabel('');[m
- [m
- end[m
- [m
-[31m-pos = 1e3.*[2.7770 1.2017 1.4000 0.3200];[m
-[31m-set(fig, 'Position', pos);[m
-[32m+[m[32m% pos = 1e3.*[2.7770 1.2017 1.4000 0.3200];[m
-[32m+[m[32m% set(fig, 'Position', pos);[m
- [m
- %% === EXPORT ===[m
-[31m-outfile = 'C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\wavelength_analysis.tikz';[m
-[31m-matlab2tikz(outfile, ...[m
-[31m- 'width','\fwidth', ...[m
-[31m- 'height','\fheight', ...[m
-[31m- 'showInfo',false, ...[m
-[31m- 'extraAxisOptions',{ ...[m
-[31m- 'legend style={font=\footnotesize}', ...[m
-[31m- 'legend columns=1' ...[m
-[31m- });[m
-[32m+[m[32m% outfile = 'C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\wavelength_analysis.tikz';[m
-[32m+[m[32m% matlab2tikz(outfile, ...[m
-[32m+[m[32m% 'width','\fwidth', ...[m
-[32m+[m[32m% 'height','\fheight', ...[m
-[32m+[m[32m% 'showInfo',false, ...[m
-[32m+[m[32m% 'extraAxisOptions',{ ...[m
-[32m+[m[32m% 'legend style={font=\footnotesize}', ...[m
-[32m+[m[32m% 'legend columns=1' ...[m
-[32m+[m[32m% });[m
- [m
- [m
- [m
-[1mdiff --git a/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m b/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m[m
-[1mindex 2213c8a..147c7d9 100644[m
-[1m--- a/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m[m
-[1m+++ b/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m[m
-[36m@@ -1,83 +1,139 @@[m
-[32m+[m[32mtablename = 'C:\Users\Silas\Documents\latex\JLT_400G_submission\HighSpeedExperiments_oneandonly_csv.csv';[m
-[32m+[m[32m% Returns a Table[m
-[32m+[m[32mdata = readtable(tablename,"Delimiter",';','DecimalSeparator',',');[m
-[32m+[m
-[32m+[m
- %% ============================================================[m
- % PLOT[m
- % ============================================================[m
-[32m+[m[32m%% 1. DATA EXTRACTION & SETUP[m
-[32m+[m[32m%% 1. DATA EXTRACTION & SETUP[m
-[32m+[m[32mraw_M = data.M;[m
-[32m+[m[32mraw_baud = data.BaudRate;[m
-[32m+[m[32mraw_net = data.NetRate;[m
-[32m+[m[32mraw_codes = string(data.ZoteroCode);[m[41m [m
-[32m+[m[32mraw_names = string(data.Name);[m
-[32m+[m[32mraw_band = string(data.Band);[m
-[32m+[m
-[32m+[m[32m% Filter Valid Data[m
-[32m+[m[32mtarget_M = [2, 4, 6, 8];[m
-[32m+[m[32mvalidIdx = ismember(raw_M, target_M) & ~isnan(raw_baud) & ~isnan(raw_net);[m
-[32m+[m
-[32m+[m[32mMvals = raw_M(validIdx);[m
-[32m+[m[32mbaud = raw_baud(validIdx);[m
-[32m+[m[32mnetrate = raw_net(validIdx);[m
-[32m+[m[32mcodes = raw_codes(validIdx);[m
-[32m+[m[32mnames = raw_names(validIdx);[m
-[32m+[m[32mbands = raw_band(validIdx);[m
-[32m+[m
-[32m+[m[32mpam_list = target_M;[m
-[32m+[m[32mcolors = flip(cbrewer2('SET1',4));[m
-[32m+[m
-[32m+[m[32m%% 2. PLOT (For Visual Check only)[m
- figure; hold on;[m
-[31m-ms = 32; % scatter size[m
-[31m-lw = 0.8; % line width[m
-[31m-[m
-[31m-for k = 1:4 % PAM-2/4/6/8[m
-[32m+[m[32mms = 20;[m[41m [m
-[32m+[m[32mlw = 0.5;[m[41m [m
- [m
-[32m+[m[32mfor k = 1:length(pam_list)[m[41m [m
- M = pam_list(k);[m
- idxPam = (Mvals == M);[m
-[31m-[m
-[31m- % Extract for this PAM[m
-[32m+[m[41m [m
- x = baud(idxPam);[m
- y = netrate(idxPam);[m
-[32m+[m[32m b = bands(idxPam);[m
- n = names(idxPam);[m
-[31m-[m
-[31m- % Get color for this PAM format[m
- col = colors(k,:);[m
-[31m-[m
-[31m- % ----- LEGEND FLAG (only add one entry per PAM) -----[m
-[32m+[m[41m [m
- firstLegend = true;[m
-[31m-[m
-[31m- % ---- PLOT ALL POINTS (marker based on publication) ----[m
-[32m+[m[41m [m
- for i = 1:sum(idxPam)[m
- [m
-[31m- % marker selection by publication[m
-[31m- pubIdx = find(pub_list == n(i), 1);[m
-[31m- marker = markerlist{mod(pubIdx-1, nMarkers) + 1};[m
-[31m-[m
-[32m+[m[32m % Marker Logic[m
-[32m+[m[32m ms = 20;[m[41m [m
-[32m+[m[32m if strcmpi(b(i), 'O')[m
-[32m+[m[32m marker = 'o';[m[41m [m
-[32m+[m[32m elseif strcmpi(b(i), 'C')[m
-[32m+[m[32m marker = 'd';[m[41m [m
-[32m+[m[32m else[m
-[32m+[m[32m marker = 's';[m[41m [m
-[32m+[m[32m end[m
-[32m+[m[32m if strcmpi(n(i), 'THIS WORK')[m
-[32m+[m[32m marker = 'pentagram';[m[41m [m
-[32m+[m[32m ms = 100;[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m % Plot Scatter[m
- if firstLegend[m
-[31m- h = scatter(x(i), y(i), ms, ...[m
-[31m- 'Marker', marker, ...[m
-[31m- 'MarkerEdgeColor', col, ...[m
-[31m- 'MarkerFaceColor', col, ...[m
-[32m+[m[32m scatter(x(i), y(i), ms, 'Marker', marker, ...[m
-[32m+[m[32m 'MarkerEdgeColor', col, 'MarkerFaceColor', col, ...[m
- 'DisplayName', sprintf('PAM-%d', M));[m
- firstLegend = false;[m
- else[m
-[31m- h = scatter(x(i), y(i), ms, ...[m
-[31m- 'Marker', marker, ...[m
-[31m- 'MarkerEdgeColor', col, ...[m
-[31m- 'MarkerFaceColor', col, ...[m
-[32m+[m[32m scatter(x(i), y(i), ms, 'Marker', marker, ...[m
-[32m+[m[32m 'MarkerEdgeColor', col, 'MarkerFaceColor', col, ...[m
- 'HandleVisibility','off');[m
- end[m
-[31m-[m
-[31m- % ====== CUSTOM DATATIP CONTENT ======[m
-[31m- dt = h.DataTipTemplate;[m
-[31m- dt.DataTipRows(1).Label = 'Baud rate';[m
-[31m- dt.DataTipRows(2).Label = 'Net rate';[m
-[31m-[m
-[31m- % Add publication name[m
-[31m- dt.DataTipRows(end+1) = dataTipTextRow('Publication', n(i));[m
-[31m-[m
-[31m-[m
- end[m
-[31m-[m
-[31m- % ---- Fit (PAM-specific) ----[m
-[31m- valid = ~isnan(x) & ~isnan(y);[m
-[31m- if sum(valid) >= 3[m
-[31m- p = polyfit(x(valid), y(valid), 2);[m
-[31m- xfit = linspace(min(x(valid)), max(x(valid)), 200);[m
-[31m- yfit = polyval(p, xfit);[m
-[31m-[m
-[31m- plot(xfit, yfit, ':', ...[m
-[31m- 'LineWidth', lw, ...[m
-[31m- 'Color', col, ...[m
-[31m- 'HandleVisibility', 'off'); % do NOT add to legend[m
-[32m+[m[41m [m
-[32m+[m[32m % Fit lines[m
-[32m+[m[32m if length(x) >= 3[m
-[32m+[m[32m [p, S, mu] = polyfit(x, y, 2);[m[41m [m
-[32m+[m[32m xfit = linspace(min(x), max(x), 200);[m
-[32m+[m[32m yfit = polyval(p, xfit, S, mu);[m
-[32m+[m[32m plot(xfit, yfit, '-', 'LineWidth', lw, 'Color', col, 'HandleVisibility', 'off');[m[41m [m
- end[m
- end[m
- [m
-[31m-grid on;[m
-[32m+[m[32mgrid on; box on;[m
- xlabel('Baud rate [GBd]');[m
- ylabel('Net rate [Gb/s]');[m
-[31m-[m
-[31m-legend('Location','northwest');[m
-[31m-set(gca,'FontSize',11);[m
-[31m-[m
-[32m+[m[32m% title('Check Command Window for TikZ Code');[m
-[32m+[m[32m% legend('Location','northwest');[m
-[32m+[m
-[32m+[m[32m%% 3. GENERATE TIKZ ANNOTATION CODE[m
-[32m+[m[32m% This prints the manual \draw commands to the console[m
-[32m+[m
-[32m+[m[32m%% GENERATE TIKZ ANNOTATION CODE[m
-[32m+[m[32m% This prints the manual \draw commands to the console[m
-[32m+[m
-[32m+[m[32m%% GENERATE TIKZ ANNOTATION CODE (Colored Borders + Tiny Font)[m
-[32m+[m[32m%% GENERATE TIKZ ANNOTATION CODE (No Arrow, Close Text)[m
-[32m+[m[32mfprintf('\n\n%% ===========================================================\n');[m
-[32m+[m[32mfprintf('%% COPY THE FOLLOWING LINES INTO YOUR .TEX FILE \n');[m
-[32m+[m[32mfprintf('%% (Paste them just before \\end{axis})\n');[m
-[32m+[m[32mfprintf('%% ===========================================================\n\n');[m
-[32m+[m
-[32m+[m[32mfor i = 1:length(baud)[m
-[32m+[m[32m bx = baud(i);[m
-[32m+[m[32m by = netrate(i);[m
-[32m+[m[32m key = codes(i);[m
-[32m+[m[32m M_val = Mvals(i);[m
-[32m+[m[41m [m
-[32m+[m[32m % --- PLACEMENT LOGIC ---[m
-[32m+[m[32m if M_val == 8[m
-[32m+[m[32m % PAM-8: Place Top-Left[m
-[32m+[m[32m % 'south east' anchor means the text's bottom-right corner touches the coordinate[m
-[32m+[m[32m % shift moves it slightly up and left to clear the marker[m
-[32m+[m[32m anchorStr = 'south east';[m
-[32m+[m[32m shiftStr = 'shift={(-3pt, 3pt)}';[m[41m [m
-[32m+[m[32m else[m
-[32m+[m[32m % Others: Place Bottom-Right[m
-[32m+[m[32m % 'north west' anchor means the text's top-left corner touches the coordinate[m
-[32m+[m[32m % shift moves it slightly down and right[m
-[32m+[m[32m anchorStr = 'north west';[m
-[32m+[m[32m shiftStr = 'shift={(3pt, -3pt)}';[m
-[32m+[m[32m end[m
-[32m+[m[41m [m
-[32m+[m[32m % --- PRINT COMMAND ---[m
-[32m+[m[32m % Uses \node directly at the coordinate (axis cs:...)[m
-[32m+[m[32m fprintf('\\node[anchor=%s, %s, font=\\tiny, fill=white, inner sep=1pt] at (axis cs:%.2f, %.2f) {\\cite{%s}};\n', ...[m
-[32m+[m[32m anchorStr, shiftStr, bx, by, key);[m
-[32m+[m[32mend[m
-[32m+[m[32mfprintf('\n')[m
- [m
- %% === EXPORT ===[m
-[31m-outfile = 'C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\highspeedresults.tikz';[m
-[32m+[m[32moutfile = 'C:\Users\Silas\Documents\latex\JLT_400G_submission\media\matlab2tikz\highspeedresults_test.tikz';[m
-[32m+[m
- matlab2tikz(outfile, ...[m
- 'width','\fwidth', ...[m
- 'height','\fheight', ...[m
-[1mdiff --git a/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m b/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m[m
-[1mindex ab31451..67a2ff8 100644[m
-[1m--- a/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m[m
-[1m+++ b/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m[m
-[36m@@ -10,10 +10,11 @@[m [mif dsp_options.mode == "load_run_id"[m
- [m
- if experiment == "highspeed_2024"[m
- [m
-[31m- dsp_options.database_type = 'mysql';[m
-[32m+[m[32m dsp_options.database_type = "mysql";[m
- dsp_options.dataBase = 'labor_highspeed';%'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\silas_labor_newdsp_newstructure.db';[m
- dsp_options.storage_path = 'Z:\2024\sioe_labor\';[m
-[31m- db = DBHandler("dataBase", [dsp_options.dataBase], "type", dsp_options.database_type);[m
-[32m+[m[32m db = DBHandler("dataBase", [dsp_options.dataBase],...[m
-[32m+[m[32m "type", dsp_options.database_type,"server","192.168.178.192","user","silas","password","silas");[m
- [m
- elseif experiment == "mpi_ecoc_2025"[m
- [m
-[1mdiff --git a/projects/ML_based_MLSE/analyze_filter_length.m b/projects/ML_based_MLSE/analyze_filter_length.m[m
-[1mindex 616b715..1b31d6b 100644[m
-[1m--- a/projects/ML_based_MLSE/analyze_filter_length.m[m
-[1m+++ b/projects/ML_based_MLSE/analyze_filter_length.m[m
-[36m@@ -5,9 +5,9 @@[m [mM = 4;[m
- randkey = 1;[m
- [m
- % --- Parameter sweep[m
-[31m-order_range = 2:3:11; % FFE order[m
-[31m-delta_range = 0:2:4; % delta[m
-[31m-SNR_dB = 20;[m
-[32m+[m[32morder_range = 5:5:50; % FFE order[m
-[32m+[m[32mdelta_range = 0:5:20; % delta[m
-[32m+[m[32mSNR_dB = 30;[m
- [m
- % --- Prepare bit sequence[m
- order_bits = 19;[m
-[36m@@ -21,10 +21,14 @@[m [mSymbols = PAMmapper(M,0).map(Bits);[m
- Symbols.fs = 200e9;[m
- [m
- % --- Channel (minimal ISI + AWGN)[m
-[31m-h = [0.3 0.9 0.3]; h = h/norm(h);[m
-[32m+[m[32mh = abs([0.3 0.9 0.3]); h = h/norm(h);[m
-[32m+[m
-[32m+[m[32m% 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];[m
-[32m+[m[32m% h = h/norm(h);[m
- symbols_filt = Symbols.filter(h,1);[m
- symbols_noi = symbols_filt;[m
- symbols_noi.signal = awgn(symbols_filt.signal,SNR_dB,'measured');[m
-[32m+[m[32msymbols_noi.spectrum();[m
- [m
- % --- Generate all parameter pairs[m
- [O,D] = ndgrid(order_range, delta_range);[m
-[36m@@ -38,7 +42,7 @@[m [mce_vec = nan(size(pairs,1),1);[m
- ce_training = nan(size(pairs,1),training_len);[m
- [m
- % --- Parallel loop over parameter pairs[m
-[31m-parfor k = 1:size(pairs,1)[m
-[32m+[m[32mfor k = 1:size(pairs,1)[m
- order_k = pairs(k,1);[m
- delta_k = pairs(k,2);[m
- [m
-[36m@@ -89,7 +93,7 @@[m [mend[m
- beautifyBERplot[m
- ylabel('BER'); xlabel('Filter Order [N]');[m
- title('BER vs. Filter order');[m
-[31m-ylim([1e-4, 0.1]);[m
-[32m+[m[32m% ylim([1e-4, 0.1]);[m
- yline(3.8e-3,'HandleVisibility','off');[m
- yline(2.2e-4,'HandleVisibility','off');[m
- [m
-[1mdiff --git a/projects/ML_based_MLSE/theoretic_channel_evaluation.m b/projects/ML_based_MLSE/theoretic_channel_evaluation.m[m
-[1mindex 3e1efcc..3eb6f09 100644[m
-[1m--- a/projects/ML_based_MLSE/theoretic_channel_evaluation.m[m
-[1m+++ b/projects/ML_based_MLSE/theoretic_channel_evaluation.m[m
-[36m@@ -48,36 +48,36 @@[m [mfor i = 1:numel(SNR_dB)[m
- symbols_noi = symbols_filt;[m
- symbols_noi.signal = awgn(symbols_filt.signal, SNR_dB(i), 'measured'); % AWGN with given SNR[m
- [m
-[31m- % % Sequence Est L=5[m
-[31m- % 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);[m
-[31m- % mlse_.DIR = h;[m
-[31m- % [y_mlse] = mlse_.process(symbols_noi,Symbols);[m
-[31m- % mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse);[m
-[31m- % [~, ~, ber_mlse_l5(i), ~] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1);[m
-[31m- % fprintf('MLSE L5: %.2e \n',ber_mlse_l5(i));[m
-[31m- % [m
-[31m- % % 2nd Approach [m
-[31m- % mu_lms = 0.0005;[m
-[31m- % pf_ncoeffs = 1;[m
-[31m- % 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");[m
-[31m- % pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[31m- % [m
-[31m- % % FFE[m
-[31m- % [y_ffe, ffe_noise] = eq_.process(symbols_noi, Symbols);[m
-[31m- % [m
-[31m- % Eq_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_ffe);[m
-[31m- % [~, ~, ber_ffe(i), ~] = calc_ber(Eq_bits.signal, Bits.signal, "skip_front", 0, "skip_end", 0, "returnErrorLocation", 1);[m
-[31m- % fprintf('FFE: %.2e \n',ber_ffe(i));[m
-[31m- % [m
-[31m- % % Postfilter[m
-[31m- % [y_white,~] = pf_.process(y_ffe, ffe_noise);[m
-[31m- % [m
-[31m- % % Sequence Est[m
-[31m- % 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);[m
-[31m- % [y_mlse] = mlse_.process(y_white,Symbols);[m
-[31m- % mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse);[m
-[31m- % [~, errors, ber_nwf_mlse_l2(i), errpos] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1);[m
-[31m- % fprintf('MLSE: %.2e \n',ber_nwf_mlse_l2(i));[m
-[32m+[m[32m % Sequence Est L=5[m
-[32m+[m[32m 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);[m
-[32m+[m[32m mlse_.DIR = h;[m
-[32m+[m[32m [y_mlse] = mlse_.process(symbols_noi,Symbols);[m
-[32m+[m[32m mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse);[m
-[32m+[m[32m [~, ~, ber_mlse_l5(i), ~] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1);[m
-[32m+[m[32m fprintf('MLSE L5: %.2e \n',ber_mlse_l5(i));[m
-[32m+[m
-[32m+[m[32m % 2nd Approach[m[41m [m
-[32m+[m[32m mu_lms = 0.0005;[m
-[32m+[m[32m pf_ncoeffs = 1;[m
-[32m+[m[32m 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");[m
-[32m+[m[32m pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);[m
-[32m+[m
-[32m+[m[32m % FFE[m
-[32m+[m[32m [y_ffe, ffe_noise] = eq_.process(symbols_noi, Symbols);[m
-[32m+[m
-[32m+[m[32m Eq_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_ffe);[m
-[32m+[m[32m [~, ~, ber_ffe(i), ~] = calc_ber(Eq_bits.signal, Bits.signal, "skip_front", 0, "skip_end", 0, "returnErrorLocation", 1);[m
-[32m+[m[32m fprintf('FFE: %.2e \n',ber_ffe(i));[m
-[32m+[m
-[32m+[m[32m % Postfilter[m
-[32m+[m[32m [y_white,~] = pf_.process(y_ffe, ffe_noise);[m
-[32m+[m
-[32m+[m[32m % Sequence Est[m
-[32m+[m[32m 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);[m
-[32m+[m[32m [y_mlse] = mlse_.process(y_white,Symbols);[m
-[32m+[m[32m mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse);[m
-[32m+[m[32m [~, errors, ber_nwf_mlse_l2(i), errpos] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1);[m
-[32m+[m[32m fprintf('MLSE: %.2e \n',ber_nwf_mlse_l2(i));[m
- [m
- % ML-base MLSE L=2[m
- adaptive_mu = 0;[m
-[1mdiff --git "a/projects/Messung_Z\303\274rich/minimal_matched.m" "b/projects/Messung_Z\303\274rich/minimal_matched.m"[m
-[1mnew file mode 100644[m
-[1mindex 0000000..a5dfa33[m
-[1m--- /dev/null[m
-[1m+++ "b/projects/Messung_Z\303\274rich/minimal_matched.m"[m
-[36m@@ -0,0 +1,60 @@[m
-[32m+[m[32mL = 4; % Oversampling factor[m
-[32m+[m[32mfsym = 1e9/4;[m
-[32m+[m[32mrollOff = 0.5; % Pulse shaping roll-off factor[m
-[32m+[m[32mhtx = rcosdesign(rollOff,16, L, 'sqrt');[m
-[32m+[m[32mhrx = conj(fliplr(htx));[m
-[32m+[m
-[32m+[m[32msignal = zeros(1000,1);[m
-[32m+[m[32msignal(500) = 1;[m
-[32m+[m[32mDigi_sig = Informationsignal(signal,"fs",fsym);[m
-[32m+[m
-[32m+[m[32m% Digi_sig = Digi_sig.resample("fs_out",L*fsym);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% Digi_sig_tx = Digi_sig.filter(htx,1);[m
-[32m+[m[32m% Digi_sig_rx = Digi_sig_tx.filter(hrx,1);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m% figure;plot(Digi_sig_tx.signal);hold on;plot(Digi_sig_rx.signal),plot(Digi_sig.signal);[m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32m%[m[41m [m
-[32m+[m[32mpulsef = Pulseformer("alpha",1,"matched",0,"fdac",Digi_sig.fs*L,"fsym",fsym,"pulse","rrc","pulselength",16);[m
-[32m+[m[32mDigi_sig = pulsef.process(Digi_sig);[m
-[32m+[m
-[32m+[m[32mpulsef = Pulseformer("alpha",1,"matched",1,"fdac",Digi_sig.fs,"fsym",fsym,"pulse","rrc","pulselength",16);[m
-[32m+[m[32mDigi_sig_matched = pulsef.process(Digi_sig);[m
-[32m+[m
-[32m+[m[32m% Filter:[m
-[32m+[m[32mhtx = rcosdesign(rollOff,16, L, 'sqrt');[m
-[32m+[m[32m% Note half of the target delay is used, because when combined[m
-[32m+[m[32m% to the matched filter, the total delay will be achieved.[m
-[32m+[m[32mhrx = conj(fliplr(htx));[m
-[32m+[m
-[32m+[m[32mfigure[m
-[32m+[m[32mplot(htx)[m
-[32m+[m[32mtitle('Transmit Filter')[m
-[32m+[m[32mxlabel('Index')[m
-[32m+[m[32mylabel('Amplitude')[m
-[32m+[m
-[32m+[m[32mfigure[m
-[32m+[m[32mplot(hrx)[m
-[32m+[m[32mtitle('Rx Filter (Matched Filter)')[m
-[32m+[m[32mxlabel('Index')[m
-[32m+[m[32mylabel('Amplitude')[m
-[32m+[m
-[32m+[m[32mp = conv(htx,hrx);[m
-[32m+[m
-[32m+[m[32mfigure[m
-[32m+[m[32mplot(p)[m
-[32m+[m[32mtitle('Combined Tx-Rx = Raised Cosine')[m
-[32m+[m[32mxlabel('Index')[m
-[32m+[m[32mylabel('Amplitude')[m
-[32m+[m
-[32m+[m[32m% And let's highlight the zero-crossings[m
-[32m+[m[32mzeroCrossings = NaN*ones(size(p));[m
-[32m+[m[32mzeroCrossings(1:L:end) = 0;[m
-[32m+[m[32mzeroCrossings((rcDelay)*L + 1) = NaN; % Except for the central index[m
-[32m+[m[32mhold on[m
-[32m+[m[32mplot(zeroCrossings, 'o')[m
-[32m+[m[32mlegend('RC Pulse', 'Zero Crossings')[m
-[32m+[m[32mhold off[m
-\ No newline at end of file[m
-[1mdiff --git a/projects/WDM/WDM_model_10km_queue.m b/projects/WDM/WDM_model_10km_queue.m[m
-[1mindex a41cb02..8aae2ea 100644[m
-[1m--- a/projects/WDM/WDM_model_10km_queue.m[m
-[1m+++ b/projects/WDM/WDM_model_10km_queue.m[m
-[36m@@ -312,7 +312,7 @@[m [mfor realiz = 1:s.num_realiz[m
- Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ...[m
- "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ...[m
- "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ...[m
-[31m- "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1).process(Opt_sig_wdm_fib);[m
-[32m+[m[32m "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",1,"useSingle",1).process(Opt_sig_wdm_fib);[m
- [m
- % -------- Evaluate at intermediate distance (enqueue jobs) --------[m
- if eval_ptr <= nEval && seg == eval_seg(eval_ptr)[m
-[1mdiff --git a/test/bayesopt_ffe_tuning.m b/test/bayesopt_ffe_tuning.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..adedb3d[m
-[1m--- /dev/null[m
-[1m+++ b/test/bayesopt_ffe_tuning.m[m
-[36m@@ -0,0 +1,219 @@[m
-[32m+[m[32m%% Bayesian Optimization for FFE Parameter Tuning[m
-[32m+[m[32m% This script uses bayesopt to find optimal mu_dd and mu_tr values[m
-[32m+[m[32m% that minimize BER for the FFE equalizer.[m
-[32m+[m
-[32m+[m[32mclear; clc;[m
-[32m+[m
-[32m+[m[32m%% Setup - Same as gpu_processing_dpfiber.m[m
-[32m+[m[32ms.wavelengthplan = calcWavelengthPlan(4, 400e9, 1310);[m
-[32m+[m[32mlink_length = 10;[m
-[32m+[m[32ms.pmd = 0.1;[m
-[32m+[m[32ms.gamma = 0.0023;[m
-[32m+[m
-[32m+[m[32ms.M = 4;[m
-[32m+[m[32mfsym = 112e9;[m
-[32m+[m[32mfdac = 2*fsym;[m
-[32m+[m[32mfadc = 120000000000;[m
-[32m+[m[32ms.random_key = 1;[m
-[32m+[m
-[32m+[m[32m% Laser / Modulator[m
-[32m+[m[32mvbias_rel = 0.5;[m
-[32m+[m[32mu_pi = 4.6;[m
-[32m+[m[32mvbias = -vbias_rel*u_pi;[m
-[32m+[m[32mlaser_linewidth = 0e6;[m
-[32m+[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m[32mrcalpha = 0.05;[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",16,"alpha",rcalpha);[m
-[32m+[m
-[32m+[m[32ms.chirpalpha = 0;[m
-[32m+[m[32ms.p_launch = 3;[m
-[32m+[m[32ms.p = "co";[m
-[32m+[m
-[32m+[m[32mN = numel(s.wavelengthplan);[m
-[32m+[m
-[32m+[m[32mswitch s.p[m
-[32m+[m[32m case "co"[m
-[32m+[m[32m pol_rot = 100.*ones(1,N);[m
-[32m+[m[32m d_local = 0;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mf_plan = physconst('lightspeed')./(s.wavelengthplan.*1e-9);[m
-[32m+[m[32mmargin = 25e12;[m
-[32m+[m[32mf_span = (max(f_plan)+margin)-(min(f_plan)-margin);[m
-[32m+[m[32mf_nyq = f_span/2;[m
-[32m+[m
-[32m+[m[32mkover = 4;[m
-[32m+[m[32mupsample_required = f_nyq./(fdac*kover/2);[m
-[32m+[m[32mupsample_pow = 2^nextpow2(upsample_required);[m
-[32m+[m
-[32m+[m[32ms.f_opt = fdac*kover*upsample_pow;[m
-[32m+[m[32ms.f_opt_nyq = s.f_opt/2;[m
-[32m+[m
-[32m+[m[32ms.rop = -8; % Fixed ROP for optimization[m
-[32m+[m
-[32m+[m[32m%% Generate TX signals (run once)[m
-[32m+[m[32mfprintf('Generating TX signals...\n');[m
-[32m+[m[32mfor l = 1:N[m
-[32m+[m[32m [Digi_sig,Symbols{l},Tx_bits{l}] = PAMsource( ...[m
-[32m+[m[32m "fsym",fsym,"M",s.M,"order",15,"useprbs",0, ...[m
-[32m+[m[32m "fs_out",fdac, ...[m
-[32m+[m[32m "applyclipping",0,"clipfactor",1.5, ...[m
-[32m+[m[32m "applypulseform",1,"pulseformer",Pform, ...[m
-[32m+[m[32m "randkey",s.random_key+l, ...[m
-[32m+[m[32m "mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode ...[m
-[32m+[m[32m ).process();[m
-[32m+[m
-[32m+[m[32m Lp_awg = Filter('filtdegree',3,"f_cutoff",56e9,"fs",fdac*kover, ...[m
-[32m+[m[32m "filterType",filtertypes.gaussian,"active",true);[m
-[32m+[m
-[32m+[m[32m El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",1,"kover",kover, ...[m
-[32m+[m[32m "bit_resolution",6,"upsampling_method","samplehold","precomp_sinc_rolloff",0, ...[m
-[32m+[m[32m "H_lpf",Lp_awg,"dac_max",0.6,"dac_min",-0.6).process(Digi_sig);[m
-[32m+[m
-[32m+[m[32m El_sig = El_sig.normalize("mode","oneone");[m
-[32m+[m[32m scaling = 0.6*(u_pi/2-abs(vbias-u_pi/2));[m
-[32m+[m[32m El_sig = El_sig .* scaling;[m
-[32m+[m
-[32m+[m[32m Eml_out = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ...[m
-[32m+[m[32m "lambda",s.wavelengthplan(l),"bias",vbias,"u_pi",u_pi, ...[m
-[32m+[m[32m "linewidth",laser_linewidth,"randomkey",s.random_key+l,"alpha",s.chirpalpha).process(El_sig);[m
-[32m+[m
-[32m+[m[32m signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",pol_rot(l)).process(Eml_out);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% WDM mux + launch[m
-[32m+[m[32mOpt_sig_wdm = Optical_Multiplex("fs_in",fdac*kover,"fs_out",upsample_pow*fdac*kover, ...[m
-[32m+[m[32m "lambda_center",1310,"random_key",0,"filtype",1,"B",120e9).process(signal_cell);[m
-[32m+[m
-[32m+[m[32mOpt_sig_wdm = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ...[m
-[32m+[m[32m "amplification_db",s.p_launch+10*log10(N)).process(Opt_sig_wdm);[m
-[32m+[m
-[32m+[m[32m%% Fiber propagation[m
-[32m+[m[32msegment_length = 1;[m
-[32m+[m[32mnSegments = link_length/segment_length;[m
-[32m+[m[32mnSegments = round(nSegments);[m
-[32m+[m
-[32m+[m[32mzdw = 1310;[m
-[32m+[m[32mrandomize_D = true;[m
-[32m+[m[32mDvec = getDispersionVector(nSegments, d_local, zdw, randomize_D, s.random_key);[m
-[32m+[m
-[32m+[m[32mOpt_sig_wdm_fib = Opt_sig_wdm;[m
-[32m+[m[32mfprintf('Running fiber propagation...\n');[m
-[32m+[m[32mfor seg = 1:nSegments[m
-[32m+[m[32m fprintf('Segment %d/%d\n', seg, nSegments);[m
-[32m+[m[32m Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ...[m
-[32m+[m[32m "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ...[m
-[32m+[m[32m "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ...[m
-[32m+[m[32m "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",true).process(Opt_sig_wdm_fib);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% Pre-process to get Rx_sig (do demux once)[m
-[32m+[m[32mfprintf('Pre-processing receiver chain...\n');[m
-[32m+[m[32ml = 1; % Use channel 1 for optimization[m
-[32m+[m
-[32m+[m[32mOpt_sig_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1, ...[m
-[32m+[m[32m "fs_out",fdac*kover,"fs_in",fdac*kover*upsample_pow,"lambda_center",1310).process(Opt_sig_wdm_fib);[m
-[32m+[m
-[32m+[m[32mOpt_sig_rx = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ...[m
-[32m+[m[32m "amplification_db",s.rop).process(Opt_sig_demux{l});[m
-[32m+[m
-[32m+[m[32mPD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20, ...[m
-[32m+[m[32m "nep",1.8e-11,"randomkey",s.random_key+l).process(Opt_sig_rx);[m
-[32m+[m
-[32m+[m[32mrx_bwl = 100e9;[m
-[32m+[m[32mPD_sig = Filter('filtdegree',4,"f_cutoff",rx_bwl,"fs",fdac*kover, ...[m
-[32m+[m[32m "filterType",filtertypes.butterworth,"active",true).process(PD_sig);[m
-[32m+[m
-[32m+[m[32mLp_scpe = Filter('filtdegree',4,"f_cutoff",80e9,"fs",fadc,"filterType",filtertypes.butterworth,"active",true);[m
-[32m+[m[32mScpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ...[m
-[32m+[m[32m "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ...[m
-[32m+[m[32m "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0, ...[m
-[32m+[m[32m "adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',0,'H_lpf',Lp_scpe).process(PD_sig);[m
-[32m+[m
-[32m+[m[32mScpe_sig_2sps = Scpe_sig.resample("fs_out",2*fsym);[m
-[32m+[m
-[32m+[m[32m[~, Scpe_cell, ~, ~] = Scpe_sig_2sps.tsynch("reference", Symbols{l}, "fs_ref", fsym, "debug_plots", 0);[m
-[32m+[m[32mRx_sig = Scpe_cell{1};[m
-[32m+[m[32mRx_sig = Rx_sig.normalize("mode","rms");[m
-[32m+[m
-[32m+[m[32mfprintf('Receiver pre-processing complete. Ready for optimization.\n\n');[m
-[32m+[m
-[32m+[m[32m%% Define the objective function for bayesopt[m
-[32m+[m[32mfunction ber = ffe_objective(params, Rx_sig, Symbols_l, Tx_bits_l, M, duob_mode)[m
-[32m+[m[32mmu_dd = params.mu_dd;[m
-[32m+[m[32mmu_tr = params.mu_tr;[m
-[32m+[m
-[32m+[m[32mtry[m
-[32m+[m[32m eq_ffe = FFE("epochs_tr", 5, "epochs_dd", 2, "len_tr", 2^13, ...[m
-[32m+[m[32m "mu_dd", mu_dd, "mu_tr", mu_tr, ...[m
-[32m+[m[32m "order", 50, "sps", 2, "decide", 0, ...[m
-[32m+[m[32m "adaption", adaption_method.nlms, "dd_mode", 1);[m
-[32m+[m
-[32m+[m[32m ffe_results = ffe(eq_ffe, M, Rx_sig, Symbols_l, Tx_bits_l, ...[m
-[32m+[m[32m "precode_mode", duob_mode, ...[m
-[32m+[m[32m 'showAnalysis', 0, ...[m
-[32m+[m[32m "postFFE", [], ...[m
-[32m+[m[32m "eth_style_symbol_mapping", 0);[m
-[32m+[m
-[32m+[m[32m ber = ffe_results.metrics.BER;[m
-[32m+[m
-[32m+[m[32m if ber == 0[m
-[32m+[m[32m ber = 1e-10;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m if ~isfinite(ber)[m
-[32m+[m[32m ber = 0.5;[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m fprintf(' mu_dd=%.4e, mu_tr=%.4e -> BER=%.4e\n', mu_dd, mu_tr, ber);[m
-[32m+[m
-[32m+[m[32mcatch ME[m
-[32m+[m[32m fprintf(' mu_dd=%.4e, mu_tr=%.4e -> FAILED (%s)\n', mu_dd, mu_tr, ME.message);[m
-[32m+[m[32m ber = 0.5;[m
-[32m+[m[32mend[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% Define optimizable variables[m
-[32m+[m[32mmu_dd_var = optimizableVariable('mu_dd', [1e-5, 0.1], 'Transform', 'log');[m
-[32m+[m[32mmu_tr_var = optimizableVariable('mu_tr', [1e-5, 0.1], 'Transform', 'log');[m
-[32m+[m
-[32m+[m[32m%% Run Bayesian Optimization[m
-[32m+[m[32mfprintf('========== Starting Bayesian Optimization ==========\n');[m
-[32m+[m[32mfprintf('Optimizing mu_dd and mu_tr to minimize BER\n');[m
-[32m+[m[32mfprintf('Search range: mu_dd=[1e-5, 0.1], mu_tr=[1e-5, 0.1]\n\n');[m
-[32m+[m
-[32m+[m[32mobjective_fn = @(params) ffe_objective(params, Rx_sig, Symbols{l}, Tx_bits{l}, s.M, duob_mode);[m
-[32m+[m
-[32m+[m[32mresults = bayesopt(objective_fn, [mu_dd_var, mu_tr_var], ...[m
-[32m+[m[32m 'MaxObjectiveEvaluations', 30, ...[m
-[32m+[m[32m 'AcquisitionFunctionName', 'expected-improvement-plus', ...[m
-[32m+[m[32m 'IsObjectiveDeterministic', false, ...[m
-[32m+[m[32m 'ExplorationRatio', 0.5, ...[m
-[32m+[m[32m 'Verbose', 1, ...[m
-[32m+[m[32m 'PlotFcn', []);[m
-[32m+[m
-[32m+[m[32m%% Display Results[m
-[32m+[m[32mfprintf('\n========== FFE Optimization Complete ==========\n');[m
-[32m+[m[32mfprintf('Best FFE parameters found:\n');[m
-[32m+[m[32mfprintf(' mu_dd = %.6e\n', results.XAtMinObjective.mu_dd);[m
-[32m+[m[32mfprintf(' mu_tr = %.6e\n', results.XAtMinObjective.mu_tr);[m
-[32m+[m[32mfprintf(' BER = %.6e\n', results.MinObjective);[m
-[32m+[m
-[32m+[m[32m%% Verify with optimal parameters[m
-[32m+[m[32mfprintf('\nVerifying optimal FFE parameters...\n');[m
-[32m+[m[32mbest_mu_dd = results.XAtMinObjective.mu_dd;[m
-[32m+[m[32mbest_mu_tr = results.XAtMinObjective.mu_tr;[m
-[32m+[m
-[32m+[m[32meq_ffe_best = FFE("epochs_tr", 5, "epochs_dd", 2, "len_tr", 2^13, ...[m
-[32m+[m[32m "mu_dd", best_mu_dd, "mu_tr", best_mu_tr, ...[m
-[32m+[m[32m "order", 50, "sps", 2, "decide", 0, ...[m
-[32m+[m[32m "adaption", adaption_method.nlms, "dd_mode", 1);[m
-[32m+[m
-[32m+[m[32mffe_results_best = ffe(eq_ffe_best, s.M, Rx_sig, Symbols{l}, Tx_bits{l}, ...[m
-[32m+[m[32m "precode_mode", duob_mode, ...[m
-[32m+[m[32m 'showAnalysis', 1, ...[m
-[32m+[m[32m "postFFE", [], ...[m
-[32m+[m[32m "eth_style_symbol_mapping", 0);[m
-[32m+[m
-[32m+[m[32mfprintf('\nFinal FFE BER with optimal parameters: %.6e\n', ffe_results_best.metrics.BER);[m
-[1mdiff --git a/test/bitwise_demapping_pam6.m b/test/bitwise_demapping_pam6.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..6ea0b3d[m
-[1m--- /dev/null[m
-[1m+++ b/test/bitwise_demapping_pam6.m[m
-[36m@@ -0,0 +1,43 @@[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%%%%% SETTINGS %%%%%%[m
-[32m+[m[32museprbs = 1;[m
-[32m+[m[32mM = 8;[m
-[32m+[m[32mrandkey = 1;[m
-[32m+[m[32mfsym = 112e9;[m
-[32m+[m[32mviewresults = 0;[m
-[32m+[m
-[32m+[m[32m%%%%% Mapping %%%%%[m
-[32m+[m[32mM = 6;[m
-[32m+[m[32mdata = 0:M-1;[m
-[32m+[m[32mbitpersymbol = log2(M);[m
-[32m+[m
-[32m+[m[32ms = RandStream('twister','Seed',1);[m
-[32m+[m[32mbitpattern = randi(s,[0 1], 2^18, 1);[m
-[32m+[m[32mbitpattern = bitpattern(1:end-mod(length(bitpattern),5));[m
-[32m+[m
-[32m+[m[32mbits_tx = Informationsignal(bitpattern);[m
-[32m+[m
-[32m+[m[32msymbols = PAMmapper(M,0).map(bits);[m
-[32m+[m
-[32m+[m[32mpam6transitions = combvec(PAMmapper(M,0).levels,PAMmapper(M,0).levels)';[m
-[32m+[m
-[32m+[m[32mpam6bits = PAMmapper(6,0,"eth_style",0).demap(reshape(pam6transitions',[],1)./sqrt(10));[m
-[32m+[m[32msymbols_rx = PAMmapper(M,0).map(pam6bits).*sqrt(10);[m
-[32m+[m
-[32m+[m[32mpam6bits = reshape(pam6bits',5,[])';[m
-[32m+[m
-[32m+[m[32mfigure; hold on[m
-[32m+[m[32mscatter(pam6transitions(:,1), pam6transitions(:,2), 'x', 'LineWidth', 1);[m
-[32m+[m[32mn = size(pam6transitions,1);[m
-[32m+[m[32mlabels = cellstr(char(pam6bits + '0')); % -> N x 1 cell array of char rows[m
-[32m+[m[32mtext(pam6transitions(:,1), pam6transitions(:,2), labels, ...[m
-[32m+[m[32m 'HorizontalAlignment','left', 'VerticalAlignment','bottom');[m
-[32m+[m
-[32m+[m
-[32m+[m
-[32m+[m[32mbits_rx = PAMmapper(M,0).demap(symbols);[m
-[32m+[m
-[32m+[m[32m[~,error_num,ber,error_pos] = calc_ber(bits_tx.signal,bits_rx.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1);[m
-[32m+[m
-[32m+[m[32mPAMmapper(8,0).showBitMapping[m
-\ No newline at end of file[m
-[1mdiff --git a/test/duobinary_minimal_example.m b/test/duobinary_minimal_example.m[m
-[1mindex d61c044..c39183e 100644[m
-[1m--- a/test/duobinary_minimal_example.m[m
-[1m+++ b/test/duobinary_minimal_example.m[m
-[36m@@ -29,9 +29,6 @@[m [mpara.skip =0;[m
- para.bruijn = 0;[m
- para.reset_prms = 0;[m
- para.method = 1;[m
-[31m-para.pcs = 0;[m
-[31m-para.shape_para = 0;[m
-[31m-para.rng_num = 0;[m
- [m
- data_in = [];[m
- global loop;[m
-[1mdiff --git a/test/gpu_cpu_comparison.m b/test/gpu_cpu_comparison.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..02d40ba[m
-[1m--- /dev/null[m
-[1m+++ b/test/gpu_cpu_comparison.m[m
-[36m@@ -0,0 +1,349 @@[m
-[32m+[m[32m%% GPU vs CPU Comparison Test for DP_Fiber[m
-[32m+[m[32m% This script runs the fiber simulation with and without GPU acceleration[m
-[32m+[m[32m% and compares the numerical results.[m
-[32m+[m
-[32m+[m[32m% clear; clc;[m
-[32m+[m
-[32m+[m[32m%% Setup (same as gpu_processing_dpfiber.m but simplified)[m
-[32m+[m[32ms.wavelengthplan = calcWavelengthPlan(4, 400e9, 1310);[m
-[32m+[m[32mlink_length = 10;[m
-[32m+[m[32ms.pmd = 0.1;[m
-[32m+[m[32ms.gamma = 0.0023;[m
-[32m+[m
-[32m+[m[32ms.M = 4;[m
-[32m+[m[32mfsym = 112e9;[m
-[32m+[m[32mfdac = 2*fsym;[m
-[32m+[m[32mfadc = 120000000000;[m
-[32m+[m[32ms.random_key = 1;[m
-[32m+[m
-[32m+[m[32m% Laser / Modulator[m
-[32m+[m[32mvbias_rel = 0.5;[m
-[32m+[m[32mu_pi = 4.6;[m
-[32m+[m[32mvbias = -vbias_rel*u_pi;[m
-[32m+[m[32mlaser_linewidth = 0e6;[m
-[32m+[m
-[32m+[m[32m% DB Stuff[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32mrcalpha = 0.05;[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",16,"alpha",rcalpha);[m
-[32m+[m
-[32m+[m[32ms.chirpalpha = 0;[m
-[32m+[m[32ms.p_launch = 3;[m
-[32m+[m[32ms.p = "co";[m
-[32m+[m
-[32m+[m[32mN = numel(s.wavelengthplan);[m
-[32m+[m
-[32m+[m[32mswitch s.p[m
-[32m+[m[32m case "co"[m
-[32m+[m[32m pol_rot = 100.*ones(1,N);[m
-[32m+[m[32m d_local = 0;[m
-[32m+[m[32m case "pair"[m
-[32m+[m[32m pol_rot = repmat([100,100,0,0],1,N/4);[m
-[32m+[m[32m d_local = 0;[m
-[32m+[m[32m case "alt"[m
-[32m+[m[32m pol_rot = repmat([100,0,100,0],1,N/4);[m
-[32m+[m[32m d_local = 0;[m
-[32m+[m[32m case "seg"[m
-[32m+[m[32m pol_rot = 100.*ones(1,N);[m
-[32m+[m[32m d_local = 3;[m
-[32m+[m[32m otherwise[m
-[32m+[m[32m error('Unknown fwm_mitigation_technique: %s', string(s.p));[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mf_plan = physconst('lightspeed')./(s.wavelengthplan.*1e-9);[m
-[32m+[m[32mmargin = 5e12;[m
-[32m+[m[32mf_span = (max(f_plan)+margin)-(min(f_plan)-margin);[m
-[32m+[m[32mf_nyq = f_span/2;[m
-[32m+[m
-[32m+[m[32mkover = 4;[m
-[32m+[m[32mupsample_required = f_nyq./(fdac*kover/2);[m
-[32m+[m[32mupsample_pow = 2^nextpow2(upsample_required);[m
-[32m+[m
-[32m+[m[32ms.f_opt = fdac*kover*upsample_pow;[m
-[32m+[m[32ms.f_opt_nyq = s.f_opt/2;[m
-[32m+[m
-[32m+[m[32m%% TX per channel[m
-[32m+[m[32mfor l = 1:N[m
-[32m+[m[32m [Digi_sig,Symbols{l},Tx_bits{l}] = PAMsource( ...[m
-[32m+[m[32m "fsym",fsym,"M",s.M,"order",15,"useprbs",0, ...[m
-[32m+[m[32m "fs_out",fdac, ...[m
-[32m+[m[32m "applyclipping",0,"clipfactor",1.5, ...[m
-[32m+[m[32m "applypulseform",1,"pulseformer",Pform, ...[m
-[32m+[m[32m "randkey",s.random_key+l, ...[m
-[32m+[m[32m "mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode ...[m
-[32m+[m[32m ).process();[m
-[32m+[m
-[32m+[m[32m Lp_awg = Filter('filtdegree',3,"f_cutoff",56e9,"fs",fdac*kover, ...[m
-[32m+[m[32m "filterType",filtertypes.gaussian,"active",true);[m
-[32m+[m
-[32m+[m[32m El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",1,"kover",kover, ...[m
-[32m+[m[32m "bit_resolution",6,"upsampling_method","samplehold","precomp_sinc_rolloff",0, ...[m
-[32m+[m[32m "H_lpf",Lp_awg,"dac_max",0.6,"dac_min",-0.6).process(Digi_sig);[m
-[32m+[m
-[32m+[m[32m clear Digi_sig[m
-[32m+[m
-[32m+[m[32m El_sig = El_sig.normalize("mode","oneone");[m
-[32m+[m[32m scaling = 0.6*(u_pi/2-abs(vbias-u_pi/2));[m
-[32m+[m[32m El_sig = El_sig .* scaling;[m
-[32m+[m
-[32m+[m[32m Eml_out = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ...[m
-[32m+[m[32m "lambda",s.wavelengthplan(l),"bias",vbias,"u_pi",u_pi, ...[m
-[32m+[m[32m "linewidth",laser_linewidth,"randomkey",s.random_key+l,"alpha",s.chirpalpha).process(El_sig);[m
-[32m+[m
-[32m+[m[32m clear El_sig[m
-[32m+[m
-[32m+[m[32m signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",pol_rot(l)).process(Eml_out);[m
-[32m+[m
-[32m+[m[32m clear Eml_out Lp_awg[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mdisp('Signal generated for all channels.');[m
-[32m+[m
-[32m+[m[32m%% WDM mux + launch[m
-[32m+[m[32mOpt_sig_wdm = Optical_Multiplex("fs_in",fdac*kover,"fs_out",upsample_pow*fdac*kover, ...[m
-[32m+[m[32m "lambda_center",1310,"random_key",0,"filtype",1,"B",120e9).process(signal_cell);[m
-[32m+[m
-[32m+[m[32mOpt_sig_wdm = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ...[m
-[32m+[m[32m "amplification_db",s.p_launch+10*log10(N)).process(Opt_sig_wdm);[m
-[32m+[m
-[32m+[m[32m% Save input for both runs[m
-[32m+[m[32mOpt_sig_input = Opt_sig_wdm;[m
-[32m+[m
-[32m+[m[32msegment_length = 1;[m
-[32m+[m[32mnSegments = link_length/segment_length;[m
-[32m+[m[32mif abs(nSegments - round(nSegments)) > 1e-12[m
-[32m+[m[32m error('fiber_length_km=%g must be an integer multiple of segment_length=%g km.', link_length, segment_length);[m
-[32m+[m[32mend[m
-[32m+[m[32mnSegments = round(nSegments);[m
-[32m+[m
-[32m+[m[32mzdw = 1310;[m
-[32m+[m[32mrandomize_D = true;[m
-[32m+[m
-[32m+[m[32mif nSegments > 0[m
-[32m+[m[32m Dvec = getDispersionVector(nSegments, d_local, zdw, randomize_D, s.random_key);[m
-[32m+[m[32melse[m
-[32m+[m[32m Dvec = [];[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m%% Run WITHOUT GPU[m
-[32m+[m[32mfprintf('\n========== Running WITHOUT GPU (CPU) ==========\n');[m
-[32m+[m[32mOpt_sig_cpu = Opt_sig_input;[m
-[32m+[m
-[32m+[m[32mtic;[m
-[32m+[m[32mfor seg = 1:nSegments[m
-[32m+[m[32m fprintf('CPU Segment %d/%d \n',seg, nSegments);[m
-[32m+[m
-[32m+[m[32m Opt_sig_cpu = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ...[m
-[32m+[m[32m "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ...[m
-[32m+[m[32m "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ...[m
-[32m+[m[32m "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",false).process(Opt_sig_cpu);[m
-[32m+[m[32mend[m
-[32m+[m[32mtime_cpu = toc;[m
-[32m+[m[32mfprintf('CPU Time: %.3f seconds\n', time_cpu);[m
-[32m+[m
-[32m+[m[32m%% Run WITH GPU (Double Precision)[m
-[32m+[m[32mfprintf('\n========== Running WITH GPU (Double Precision) ==========\n');[m
-[32m+[m[32mOpt_sig_gpu_double = Opt_sig_input;[m
-[32m+[m
-[32m+[m[32mtic;[m
-[32m+[m[32mfor seg = 1:nSegments[m
-[32m+[m[32m fprintf('GPU-Double Segment %d/%d \n',seg, nSegments);[m
-[32m+[m
-[32m+[m[32m Opt_sig_gpu_double = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ...[m
-[32m+[m[32m "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ...[m
-[32m+[m[32m "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ...[m
-[32m+[m[32m "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",false).process(Opt_sig_gpu_double);[m
-[32m+[m[32mend[m
-[32m+[m[32mtime_gpu_double = toc;[m
-[32m+[m[32mfprintf('GPU Double Time: %.3f seconds\n', time_gpu_double);[m
-[32m+[m
-[32m+[m[32m%% Run WITH GPU (Single Precision)[m
-[32m+[m[32mfprintf('\n========== Running WITH GPU (Single Precision) ==========\n');[m
-[32m+[m[32mOpt_sig_gpu_single = Opt_sig_input;[m
-[32m+[m
-[32m+[m[32mtic;[m
-[32m+[m[32mfor seg = 1:nSegments[m
-[32m+[m[32m fprintf('GPU-Single Segment %d/%d \n',seg, nSegments);[m
-[32m+[m
-[32m+[m[32m Opt_sig_gpu_single = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ...[m
-[32m+[m[32m "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ...[m
-[32m+[m[32m "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ...[m
-[32m+[m[32m "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",true).process(Opt_sig_gpu_single);[m
-[32m+[m[32mend[m
-[32m+[m[32mtime_gpu_single = toc;[m
-[32m+[m[32mfprintf('GPU Single Time: %.3f seconds\n', time_gpu_single);[m
-[32m+[m
-[32m+[m[32m%% Compare Results[m
-[32m+[m[32mfprintf('\n========== Numerical Comparison ==========\n');[m
-[32m+[m
-[32m+[m[32msig_cpu = Opt_sig_cpu.signal;[m
-[32m+[m[32msig_gpu_double = Opt_sig_gpu_double.signal;[m
-[32m+[m[32msig_gpu_single = Opt_sig_gpu_single.signal;[m
-[32m+[m
-[32m+[m[32m% Check dimensions[m
-[32m+[m[32mfprintf('CPU signal size: [%d x %d]\n', size(sig_cpu,1), size(sig_cpu,2));[m
-[32m+[m[32mfprintf('GPU Double signal size: [%d x %d]\n', size(sig_gpu_double,1), size(sig_gpu_double,2));[m
-[32m+[m[32mfprintf('GPU Single signal size: [%d x %d]\n', size(sig_gpu_single,1), size(sig_gpu_single,2));[m
-[32m+[m
-[32m+[m[32m% CPU vs GPU Double[m
-[32m+[m[32mfprintf('\n--- CPU vs GPU Double ---\n');[m
-[32m+[m[32mdiff_cpu_double = abs(sig_cpu - sig_gpu_double);[m
-[32m+[m[32mmax_diff_cpu_double = max(diff_cpu_double(:));[m
-[32m+[m[32mmean_diff_cpu_double = mean(diff_cpu_double(:));[m
-[32m+[m[32mrel_diff_cpu_double = max_diff_cpu_double / max(abs(sig_cpu(:)));[m
-[32m+[m[32mfprintf('Max absolute difference: %.6e\n', max_diff_cpu_double);[m
-[32m+[m[32mfprintf('Mean absolute difference: %.6e\n', mean_diff_cpu_double);[m
-[32m+[m[32mfprintf('Max relative difference: %.6e\n', rel_diff_cpu_double);[m
-[32m+[m
-[32m+[m[32m% CPU vs GPU Single[m
-[32m+[m[32mfprintf('\n--- CPU vs GPU Single ---\n');[m
-[32m+[m[32mdiff_cpu_single = abs(sig_cpu - sig_gpu_single);[m
-[32m+[m[32mmax_diff_cpu_single = max(diff_cpu_single(:));[m
-[32m+[m[32mmean_diff_cpu_single = mean(diff_cpu_single(:));[m
-[32m+[m[32mrel_diff_cpu_single = max_diff_cpu_single / max(abs(sig_cpu(:)));[m
-[32m+[m[32mfprintf('Max absolute difference: %.6e\n', max_diff_cpu_single);[m
-[32m+[m[32mfprintf('Mean absolute difference: %.6e\n', mean_diff_cpu_single);[m
-[32m+[m[32mfprintf('Max relative difference: %.6e\n', rel_diff_cpu_single);[m
-[32m+[m
-[32m+[m[32m% GPU Double vs GPU Single[m
-[32m+[m[32mfprintf('\n--- GPU Double vs GPU Single ---\n');[m
-[32m+[m[32mdiff_double_single = abs(sig_gpu_double - sig_gpu_single);[m
-[32m+[m[32mmax_diff_double_single = max(diff_double_single(:));[m
-[32m+[m[32mmean_diff_double_single = mean(diff_double_single(:));[m
-[32m+[m[32mrel_diff_double_single = max_diff_double_single / max(abs(sig_gpu_double(:)));[m
-[32m+[m[32mfprintf('Max absolute difference: %.6e\n', max_diff_double_single);[m
-[32m+[m[32mfprintf('Mean absolute difference: %.6e\n', mean_diff_double_single);[m
-[32m+[m[32mfprintf('Max relative difference: %.6e\n', rel_diff_double_single);[m
-[32m+[m
-[32m+[m[32m% Check tolerances[m
-[32m+[m[32mfprintf('\n--- Tolerance Check ---\n');[m
-[32m+[m[32mtol_double = 1e-10;[m
-[32m+[m[32mtol_single = 1e-5; % Single precision has ~7 significant digits[m
-[32m+[m
-[32m+[m[32mif max_diff_cpu_double < tol_double[m
-[32m+[m[32m fprintf('✓ CPU vs GPU Double: EQUIVALENT (diff < %.0e)\n', tol_double);[m
-[32m+[m[32melse[m
-[32m+[m[32m fprintf('✗ CPU vs GPU Double: DIFFER beyond tolerance (%.0e)\n', tol_double);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mif max_diff_cpu_single < tol_single[m
-[32m+[m[32m fprintf('✓ CPU vs GPU Single: ACCEPTABLE (diff < %.0e)\n', tol_single);[m
-[32m+[m[32melse[m
-[32m+[m[32m fprintf('⚠ CPU vs GPU Single: Precision loss detected (diff = %.2e, tol = %.0e)\n', max_diff_cpu_single, tol_single);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m% Performance comparison[m
-[32m+[m[32mfprintf('\n========== Performance Summary ==========\n');[m
-[32m+[m[32mfprintf('CPU Time: %.3f s\n', time_cpu);[m
-[32m+[m[32mfprintf('GPU Double Time: %.3f s\n', time_gpu_double);[m
-[32m+[m[32mfprintf('GPU Single Time: %.3f s\n', time_gpu_single);[m
-[32m+[m[32mfprintf('\n');[m
-[32m+[m[32mfprintf('Speedup (GPU Double vs CPU): %.2fx\n', time_cpu/time_gpu_double);[m
-[32m+[m[32mfprintf('Speedup (GPU Single vs CPU): %.2fx\n', time_cpu/time_gpu_single);[m
-[32m+[m[32mfprintf('Speedup (GPU Single vs GPU Double): %.2fx\n', time_gpu_double/time_gpu_single);[m
-[32m+[m
-[32m+[m[32m%% ========== BER Comparison ==========[m
-[32m+[m[32m% Process each fiber output through simplified receiver to check if[m
-[32m+[m[32m% single-precision affects actual BER performance[m
-[32m+[m
-[32m+[m[32mfprintf('\n========== BER Comparison ==========\n');[m
-[32m+[m[32mfprintf('Processing signals through receiver chain...\n');[m
-[32m+[m
-[32m+[m[32m% Receiver parameters[m
-[32m+[m[32mrop = -7; % Received optical power [dBm][m
-[32m+[m[32mlen_tr = 4096; % Training length[m
-[32m+[m[32mmu_dc = 0.005;[m
-[32m+[m[32mmu_ffe = [0.0001 0.0008 0.001];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m
-[32m+[m[32m% Helper function to process through receiver and get BER[m
-[32m+[m[32mfunction ber = process_receiver(Opt_sig_fib, l, Symbols, Tx_bits, ...[m
-[32m+[m[32m fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode)[m
-[32m+[m
-[32m+[m[32m% Demux single channel[m
-[32m+[m[32mOpt_sig_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1, ...[m
-[32m+[m[32m "fs_out",fdac*kover,"fs_in",fdac*kover*upsample_pow,"lambda_center",1310).process(Opt_sig_fib);[m
-[32m+[m
-[32m+[m[32m% ROP amplifier[m
-[32m+[m[32mOpt_sig_rx = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ...[m
-[32m+[m[32m "amplification_db",rop).process(Opt_sig_demux{l});[m
-[32m+[m
-[32m+[m[32m% Photodiode[m
-[32m+[m[32mPD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20, ...[m
-[32m+[m[32m "nep",1.8e-11,"randomkey",s.random_key+l).process(Opt_sig_rx);[m
-[32m+[m
-[32m+[m[32m% Low-pass filter[m
-[32m+[m[32mrx_bwl = 100e9;[m
-[32m+[m[32mPD_sig = Filter('filtdegree',4,"f_cutoff",rx_bwl,"fs",fdac*kover, ...[m
-[32m+[m[32m "filterType",filtertypes.butterworth,"active",true).process(PD_sig);[m
-[32m+[m
-[32m+[m[32m% Scope[m
-[32m+[m[32mLp_scpe = Filter('filtdegree',4,"f_cutoff",80e9,"fs",fadc,"filterType",filtertypes.butterworth,"active",true);[m
-[32m+[m[32mScpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ...[m
-[32m+[m[32m "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ...[m
-[32m+[m[32m "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0, ...[m
-[32m+[m[32m "adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',0,'H_lpf',Lp_scpe).process(PD_sig);[m
-[32m+[m
-[32m+[m[32m% Resample to 2 sps[m
-[32m+[m[32mScpe_sig_2sps = Scpe_sig.resample("fs_out",2*fsym);[m
-[32m+[m
-[32m+[m[32m% Time sync[m
-[32m+[m[32m[~, Scpe_cell, ~, ~] = Scpe_sig_2sps.tsynch("reference", Symbols{l}, "fs_ref", fsym, "debug_plots", 0);[m
-[32m+[m[32mRx_sig = Scpe_cell{1};[m
-[32m+[m[32mRx_sig = Rx_sig.normalize("mode","rms");[m
-[32m+[m
-[32m+[m[32m% FFE Equalizer[m
-[32m+[m[32mffe_order = [50, 0, 0];[m
-[32m+[m[32meq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0);[m
-[32m+[m
-[32m+[m[32mffe_results = ffe(eq_ffe,s.M,Rx_sig,Symbols{l},Tx_bits{l}, ...[m
-[32m+[m[32m "precode_mode",duob_mode, ...[m
-[32m+[m[32m 'showAnalysis',0, ...[m
-[32m+[m[32m "postFFE",[], ...[m
-[32m+[m[32m "eth_style_symbol_mapping",0);[m
-[32m+[m
-[32m+[m[32mber = ffe_results.metrics.BER;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m% Process each mode for channel 1[m
-[32m+[m[32ml = 4; % Use first channel for comparison[m
-[32m+[m
-[32m+[m[32mfprintf('Processing CPU result...\n');[m
-[32m+[m[32mber_cpu = process_receiver(Opt_sig_cpu, l, Symbols, Tx_bits, ...[m
-[32m+[m[32m fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode);[m
-[32m+[m
-[32m+[m[32mfprintf('Processing GPU Double result...\n');[m
-[32m+[m[32mber_gpu_double = process_receiver(Opt_sig_gpu_double, l, Symbols, Tx_bits, ...[m
-[32m+[m[32m fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode);[m
-[32m+[m
-[32m+[m[32mfprintf('Processing GPU Single result...\n');[m
-[32m+[m[32mber_gpu_single = process_receiver(Opt_sig_gpu_single, l, Symbols, Tx_bits, ...[m
-[32m+[m[32m fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode);[m
-[32m+[m
-[32m+[m[32m% Display BER results[m
-[32m+[m[32mfprintf('\n========== BER Results (Channel %d, ROP = %d dBm) ==========\n', l, rop);[m
-[32m+[m[32mfprintf('CPU: BER = %.4e\n', ber_cpu);[m
-[32m+[m[32mfprintf('GPU Double: BER = %.4e\n', ber_gpu_double);[m
-[32m+[m[32mfprintf('GPU Single: BER = %.4e\n', ber_gpu_single);[m
-[32m+[m
-[32m+[m[32mfprintf('\n--- BER Comparison ---\n');[m
-[32m+[m[32mif ber_cpu == 0 && ber_gpu_double == 0 && ber_gpu_single == 0[m
-[32m+[m[32m fprintf('✓ All BERs are zero (no errors detected)\n');[m
-[32m+[m[32melse[m
-[32m+[m[32m ber_diff_double = abs(ber_cpu - ber_gpu_double);[m
-[32m+[m[32m ber_diff_single = abs(ber_cpu - ber_gpu_single);[m
-[32m+[m[32m fprintf('|BER_cpu - BER_gpu_double| = %.4e\n', ber_diff_double);[m
-[32m+[m[32m fprintf('|BER_cpu - BER_gpu_single| = %.4e\n', ber_diff_single);[m
-[32m+[m
-[32m+[m[32m if ber_diff_double < 1e-6 && ber_diff_single < 1e-6[m
-[32m+[m[32m fprintf('✓ BER differences are negligible\n');[m
-[32m+[m[32m elseif ber_diff_single > ber_diff_double * 10[m
-[32m+[m[32m fprintf('⚠ Single precision shows measurable BER impact\n');[m
-[32m+[m[32m else[m
-[32m+[m[32m fprintf('✓ BER differences within acceptable range\n');[m
-[32m+[m[32m end[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mfprintf('\n========== Test Complete ==========\n');[m
-[1mdiff --git a/test/gpu_processing_dpfiber.m b/test/gpu_processing_dpfiber.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..317833e[m
-[1m--- /dev/null[m
-[1m+++ b/test/gpu_processing_dpfiber.m[m
-[36m@@ -0,0 +1,265 @@[m
-[32m+[m
-[32m+[m
-[32m+[m[32ms.wavelengthplan = calcWavelengthPlan(16, 400e9, 1310);[m
-[32m+[m[32mN = numel(s.wavelengthplan);[m
-[32m+[m[32mlink_length = 10;[m
-[32m+[m[32ms.pmd = 0.1;%0.1;[m
-[32m+[m[32ms.gamma = 0.0023;[m
-[32m+[m
-[32m+[m[32ms.M = 4;[m
-[32m+[m[32mfsym = 112e9;[m
-[32m+[m[32mfdac = 2*fsym;[m
-[32m+[m[32mfadc = 120000000000;[m
-[32m+[m[32ms.random_key = 1;[m
-[32m+[m
-[32m+[m[32m% Laser / s.Modulator[m
-[32m+[m[32mvbias_rel = 0.5;[m
-[32m+[m[32mu_pi = 4.6;[m
-[32m+[m[32mvbias = -vbias_rel*u_pi;[m
-[32m+[m[32mlaser_linewidth = 0e6;[m
-[32m+[m
-[32m+[m[32m% DB Stuff[m
-[32m+[m[32mduob_mode = db_mode.no_db;[m
-[32m+[m
-[32m+[m[32mrcalpha = 0.05;[m
-[32m+[m[32mPform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",16,"alpha",rcalpha);[m
-[32m+[m
-[32m+[m[32ms.chirpalpha = 0;[m
-[32m+[m
-[32m+[m[32ms.p_launch = 3;[m
-[32m+[m[32ms.p = "co";[m
-[32m+[m
-[32m+[m[32mswitch s.p[m
-[32m+[m[32m case "co"[m
-[32m+[m[32m pol_rot = 100.*ones(1,N);[m
-[32m+[m[32m d_local = 0;[m
-[32m+[m[32m case "pair"[m
-[32m+[m[32m pol_rot = repmat([100,100,0,0],1,N/4);[m
-[32m+[m[32m d_local = 0;[m
-[32m+[m[32m case "alt"[m
-[32m+[m[32m pol_rot = repmat([100,0,100,0],1,N/4);[m
-[32m+[m[32m d_local = 0;[m
-[32m+[m[32m case "seg"[m
-[32m+[m[32m pol_rot = 100.*ones(1,N);[m
-[32m+[m[32m d_local = 3;[m
-[32m+[m[32m otherwise[m
-[32m+[m[32m error('Unknown fwm_mitigation_technique: %s', string(s.p));[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mf_plan = physconst('lightspeed')./(s.wavelengthplan.*1e-9);[m
-[32m+[m[32mmargin = 25e12; % some THz left and right[m
-[32m+[m[32mf_span = (max(f_plan)+margin)-(min(f_plan)-margin);[m
-[32m+[m[32mf_nyq = f_span/2;[m
-[32m+[m
-[32m+[m[32mkover = 4;[m
-[32m+[m[32mupsample_required = f_nyq./(fdac*kover/2);[m
-[32m+[m[32mupsample_pow = 2^nextpow2(upsample_required);[m
-[32m+[m
-[32m+[m[32ms.f_opt = fdac*kover*upsample_pow;[m
-[32m+[m[32ms.f_opt_nyq = s.f_opt/2;[m
-[32m+[m
-[32m+[m[32ms.rop = -10:1:0;[m
-[32m+[m
-[32m+[m[32mprofile on[m
-[32m+[m
-[32m+[m[32m%% ---------- TX per channel ----------[m
-[32m+[m[32mfor l = 1:N[m
-[32m+[m
-[32m+[m[32m [Digi_sig,Symbols{l},Tx_bits{l}] = PAMsource( ...[m
-[32m+[m[32m "fsym",fsym,"M",s.M,"order",17,"useprbs",0, ...[m
-[32m+[m[32m "fs_out",fdac, ...[m
-[32m+[m[32m "applyclipping",0,"clipfactor",1.5, ...[m
-[32m+[m[32m "applypulseform",1,"pulseformer",Pform, ...[m
-[32m+[m[32m "randkey",s.random_key+l, ...[m
-[32m+[m[32m "mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode ...[m
-[32m+[m[32m ).process();[m
-[32m+[m
-[32m+[m[32m Lp_awg = Filter('filtdegree',3,"f_cutoff",56e9,"fs",fdac*kover, ...[m
-[32m+[m[32m "filterType",filtertypes.gaussian,"active",true);[m
-[32m+[m
-[32m+[m[32m El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",1,"kover",kover, ...[m
-[32m+[m[32m "bit_resolution",6,"upsampling_method","samplehold","precomp_sinc_rolloff",0, ...[m
-[32m+[m[32m "H_lpf",Lp_awg,"dac_max",0.6,"dac_min",-0.6).process(Digi_sig);[m
-[32m+[m
-[32m+[m[32m % Digi_sig not needed after AWG[m
-[32m+[m[32m clear Digi_sig[m
-[32m+[m
-[32m+[m[32m % Electrical Driver Amplifier[m
-[32m+[m[32m El_sig = El_sig.normalize("mode","oneone");[m
-[32m+[m[32m scaling = 0.6*(u_pi/2-abs(vbias-u_pi/2));[m
-[32m+[m[32m El_sig = El_sig .* scaling;[m
-[32m+[m
-[32m+[m[32m % E/O Conversion[m
-[32m+[m[32m Eml_out = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ...[m
-[32m+[m[32m "lambda",s.wavelengthplan(l),"bias",vbias,"u_pi",u_pi, ...[m
-[32m+[m[32m "linewidth",laser_linewidth,"randomkey",s.random_key+l,"alpha",s.chirpalpha).process(El_sig);[m
-[32m+[m
-[32m+[m[32m % El_sig not needed after EML[m
-[32m+[m[32m clear El_sig[m
-[32m+[m
-[32m+[m[32m signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",pol_rot(l)).process(Eml_out);[m
-[32m+[m
-[32m+[m[32m % Eml_out not needed after pol controller[m
-[32m+[m[32m clear Eml_out Lp_awg[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mdisp('Signal generated for all channels.');[m
-[32m+[m
-[32m+[m[32m%% ---------- WDM mux + launch ----------[m
-[32m+[m[32mOpt_sig_wdm = Optical_Multiplex("fs_in",fdac*kover,"fs_out",upsample_pow*fdac*kover, ...[m
-[32m+[m[32m "lambda_center",1310,"random_key",0,"filtype",1,"B",120e9).process(signal_cell);[m
-[32m+[m
-[32m+[m[32mOpt_sig_wdm.spectrum();[m
-[32m+[m
-[32m+[m[32mOpt_sig_wdm = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ...[m
-[32m+[m[32m "amplification_db",s.p_launch+10*log10(N)).process(Opt_sig_wdm);[m
-[32m+[m
-[32m+[m[32mOpt_sig_wdm_fib = Opt_sig_wdm;[m
-[32m+[m
-[32m+[m[32msegment_length = 1;[m
-[32m+[m[32mnSegments = link_length/segment_length;[m
-[32m+[m[32mif abs(nSegments - round(nSegments)) > 1e-12[m
-[32m+[m[32m error('fiber_length_km=%g must be an integer multiple of segment_length=%g km.', link_length, segment_length);[m
-[32m+[m[32mend[m
-[32m+[m[32mnSegments = round(nSegments);[m
-[32m+[m
-[32m+[m[32mzdw = 1310;[m
-[32m+[m[32mrandomize_D = true;[m
-[32m+[m
-[32m+[m[32m% Guard for 0 km: avoid calling getDispersionVector(0,...) if it doesn't support it[m
-[32m+[m[32mif nSegments > 0[m
-[32m+[m[32m Dvec = getDispersionVector(nSegments, d_local, zdw, randomize_D, s.random_key);[m
-[32m+[m[32melse[m
-[32m+[m[32m Dvec = [];[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mfor seg = 1:nSegments[m
-[32m+[m
-[32m+[m[32m fprintf('Segment %d/%d \n',seg, nSegments);[m
-[32m+[m
-[32m+[m[32m Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ...[m
-[32m+[m[32m "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ...[m
-[32m+[m[32m "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ...[m
-[32m+[m[32m "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",1).process(Opt_sig_wdm_fib);[m
-[32m+[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32mprofile off[m
-[32m+[m[32mprofile viewer[m
-[32m+[m
-[32m+[m[32mOpt_sig_wdm_fib.spectrum();[m
-[32m+[m
-[32m+[m[32m%% ========== BER Evaluation ==========[m
-[32m+[m[32mfprintf('\n========== BER Evaluation ==========\n');[m
-[32m+[m[32mfprintf('Processing signals through receiver chain...\n');[m
-[32m+[m
-[32m+[m[32m% Receiver parameters[m
-[32m+[m[32mlen_tr = 4096; % Training length[m
-[32m+[m[32mmu_dc = 0.005;[m
-[32m+[m[32mmu_ffe = [0.0001 0.0008 0.001];[m
-[32m+[m[32mmu_dfe = 0.0004;[m
-[32m+[m
-[32m+[m[32m% Helper function to process through receiver and get BER[m
-[32m+[m[32mfunction ber = process_receiver(Opt_sig_fib, l, Symbols, Tx_bits, ...[m
-[32m+[m[32m fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode)[m
-[32m+[m
-[32m+[m[32m% Demux single channel[m
-[32m+[m[32mOpt_sig_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1, ...[m
-[32m+[m[32m "fs_out",fdac*kover,"fs_in",fdac*kover*upsample_pow,"lambda_center",1310).process(Opt_sig_fib);[m
-[32m+[m
-[32m+[m[32m% ROP amplifier[m
-[32m+[m[32mOpt_sig_rx = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ...[m
-[32m+[m[32m "amplification_db",rop).process(Opt_sig_demux{l});[m
-[32m+[m
-[32m+[m[32m% Photodiode[m
-[32m+[m[32mPD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20, ...[m
-[32m+[m[32m "nep",1.8e-11,"randomkey",s.random_key+l).process(Opt_sig_rx);[m
-[32m+[m
-[32m+[m[32m% Low-pass filter[m
-[32m+[m[32mrx_bwl = 100e9;[m
-[32m+[m[32mPD_sig = Filter('filtdegree',4,"f_cutoff",rx_bwl,"fs",fdac*kover, ...[m
-[32m+[m[32m "filterType",filtertypes.butterworth,"active",true).process(PD_sig);[m
-[32m+[m
-[32m+[m[32m% Scope[m
-[32m+[m[32mLp_scpe = Filter('filtdegree',4,"f_cutoff",80e9,"fs",fadc,"filterType",filtertypes.butterworth,"active",true);[m
-[32m+[m[32mScpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ...[m
-[32m+[m[32m "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ...[m
-[32m+[m[32m "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0, ...[m
-[32m+[m[32m "adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',0,'H_lpf',Lp_scpe).process(PD_sig);[m
-[32m+[m
-[32m+[m[32m% Resample to 2 sps[m
-[32m+[m[32mScpe_sig_2sps = Scpe_sig.resample("fs_out",2*fsym);[m
-[32m+[m
-[32m+[m[32m% Time sync[m
-[32m+[m[32m[~, Scpe_cell, ~, ~] = Scpe_sig_2sps.tsynch("reference", Symbols{l}, "fs_ref", fsym, "debug_plots", 0);[m
-[32m+[m[32mRx_sig = Scpe_cell{1};[m
-[32m+[m[32mRx_sig = Rx_sig.normalize("mode","rms");[m
-[32m+[m
-[32m+[m[32m% FFE Equalizer[m
-[32m+[m[32mffe_order = [50, 0, 0];[m
-[32m+[m[32meq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ...[m
-[32m+[m[32m "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0);[m
-[32m+[m[32meq_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);[m
-[32m+[m
-[32m+[m[32mffe_results = ffe(eq_ffe,s.M,Rx_sig,Symbols{l},Tx_bits{l}, ...[m
-[32m+[m[32m "precode_mode",duob_mode, ...[m
-[32m+[m[32m 'showAnalysis',0, ...[m
-[32m+[m[32m "postFFE",[], ...[m
-[32m+[m[32m "eth_style_symbol_mapping",0);[m
-[32m+[m
-[32m+[m[32mber = ffe_results.metrics.BER;[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m% Process each ROP value for selected channels using parfor[m
-[32m+[m[32mber_results = zeros(length(s.rop), N);[m
-[32m+[m
-[32m+[m[32m% Flatten loop for parfor: iterate over all (ROP, channel) combinations[m
-[32m+[m[32mnum_rop = length(s.rop);[m
-[32m+[m[32mrop_vals = s.rop;[m
-[32m+[m[32mber_flat = zeros(num_rop * N, 1);[m
-[32m+[m
-[32m+[m[32mparfor idx = 1:(num_rop * N)[m
-[32m+[m[32m % Convert linear index to (ri, l) subscripts[m
-[32m+[m[32m ri = ceil(idx / N);[m
-[32m+[m[32m l = mod(idx - 1, N) + 1;[m
-[32m+[m
-[32m+[m[32m fprintf('ROP %d dBm, Channel %d/%d\n', rop_vals(ri), l, N);[m
-[32m+[m[32m ber_flat(idx) = process_receiver(Opt_sig_wdm_fib, l, Symbols, Tx_bits, ...[m
-[32m+[m[32m fdac, kover, upsample_pow, fsym, fadc, rop_vals(ri), s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode);[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m% Reshape back to [num_rop × N] matrix[m
-[32m+[m[32mber_results = reshape(ber_flat, [N, num_rop]).';[m
-[32m+[m
-[32m+[m
-[32m+[m[32m%% Display BER Results[m
-[32m+[m[32mfprintf('\n========== BER Results ==========\n');[m
-[32m+[m[32mfprintf('ROP [dBm] | ');[m
-[32m+[m[32mfor l = 1:N[m
-[32m+[m[32m fprintf('Ch%d | ', l);[m
-[32m+[m[32mend[m
-[32m+[m[32mfprintf('\n');[m
-[32m+[m
-[32m+[m[32mfor ri = 1:length(s.rop)[m
-[32m+[m[32m fprintf('%8d | ', s.rop(ri));[m
-[32m+[m[32m for l = 1:N[m
-[32m+[m[32m fprintf('%.2e | ', ber_results(ri, l));[m
-[32m+[m[32m end[m
-[32m+[m[32m fprintf('\n');[m
-[32m+[m[32mend[m
-[32m+[m
-[32m+[m[32m% Plot BER vs ROP[m
-[32m+[m[32mfigure;[m
-[32m+[m[32msemilogy(s.rop, mean(ber_results, 2), '-o', 'LineWidth', 2);[m
-[32m+[m[32mhold on;[m
-[32m+[m[32mfor l = 1:N[m
-[32m+[m[32m semilogy(s.rop, ber_results(:, l), '--', 'LineWidth', 1);[m
-[32m+[m[32mend[m
-[32m+[m[32mhold off;[m
-[32m+[m[32mxlabel('ROP [dBm]');[m
-[32m+[m[32mylabel('BER');[m
-[32m+[m[32mtitle('BER vs Received Optical Power (GPU Single Precision)');[m
-[32m+[m[32mlegend(['Mean', arrayfun(@(x) sprintf('Ch%d', x), 1:N, 'UniformOutput', false)]);[m
-[32m+[m[32mgrid on;[m
-[32m+[m
-[32m+[m[32mfprintf('\n========== Test Complete ==========\n');[m
-[1mdiff --git a/test/gpu_processing_test.m b/test/gpu_processing_test.m[m
-[1mnew file mode 100644[m
-[1mindex 0000000..b08c03f[m
-[1m--- /dev/null[m
-[1m+++ b/test/gpu_processing_test.m[m
-[36m@@ -0,0 +1,70 @@[m
-[32m+[m[32m% 1. Setup Data OUTSIDE the timer[m
-[32m+[m[32md = gpuDevice;[m
-[32m+[m[32mN = 10000;[m
-[32m+[m
-[32m+[m[32mfprintf('Preparing data...\n');[m
-[32m+[m[32mA_cpu_double = rand(N, N); % Create double on CPU[m
-[32m+[m[32mA_cpu_single = single(A_cpu_double); % Create single on CPU[m
-[32m+[m
-[32m+[m[32m% Warmup run (wakes up the GPU from idle state)[m
-[32m+[m[32mA_warm = gpuArray.rand(1000, 1000, 'single');[m
-[32m+[m[32mB_warm = A_warm * A_warm;[m
-[32m+[m[32mwait(d);[m[41m [m
-[32m+[m
-[32m+[m[32mfprintf('------------------------------------------------\n');[m
-[32m+[m
-[32m+[m[32m% TEST 1: Double Precision (The "Slow" way)[m
-[32m+[m[32m% We move data to GPU first so we only measure calculation time[m
-[32m+[m[32mA_gpu_double = gpuArray(A_cpu_double);[m[41m [m
-[32m+[m[32mwait(d); % Ensure transfer is done before starting timer[m
-[32m+[m
-[32m+[m[32mfprintf('Running DOUBLE precision test... ');[m
-[32m+[m[32mtic;[m
-[32m+[m[32mB_gpu = A_gpu_double * A_gpu_double;[m
-[32m+[m[32mwait(d); % FORCE MATLAB TO WAIT FOR GPU[m
-[32m+[m[32mtime_double = toc;[m
-[32m+[m[32mfprintf('Done.\n');[m
-[32m+[m[32mfprintf('Double Precision Time: %.4f seconds\n', time_double);[m
-[32m+[m
-[32m+[m[32m% TEST 2: Single Precision (The "Fast" way)[m
-[32m+[m[32mA_gpu_single = gpuArray(A_cpu_single);[m
-[32m+[m[32mwait(d); % Ensure transfer is done[m
-[32m+[m
-[32m+[m[32mfprintf('Running SINGLE precision test... ');[m
-[32m+[m[32mtic;[m
-[32m+[m[32mB_gpu = A_gpu_single * A_gpu_single;[m
-[32m+[m[32mwait(d); % FORCE MATLAB TO WAIT FOR GPU[m
-[32m+[m[32mtime_single = toc;[m
-[32m+[m[32mfprintf('Done.\n');[m
-[32m+[m[32mfprintf('Single Precision Time: %.4f seconds\n', time_single);[m
-[32m+[m
-[32m+[m[32m% Calculate Speedup[m
-[32m+[m[32mfprintf('------------------------------------------------\n');[m
-[32m+[m[32mfprintf('Speedup Factor using single precision: %.2fx\n', time_double / time_single);[m
-[32m+[m
-[32m+[m[32m%[m
-[32m+[m[32m% Create 10,000 small matrices (10x10) stacked in a 3D array[m
-[32m+[m[32mA_stack = gpuArray.rand(10, 10, 10000, 'single');[m
-[32m+[m[32mB_stack = gpuArray.rand(10, 10, 10000, 'single');[m
-[32m+[m
-[32m+[m[32m% BAD: Looping (GPU overhead kills you)[m
-[32m+[m[32mtic;[m
-[32m+[m[32mfor i=1:10000[m
-[32m+[m[32m C(:,:,i) = A_stack(:,:,i) * B_stack(:,:,i);[m
-[32m+[m[32mend[m
-[32m+[m[32mwait(d);[m
-[32m+[m[32mloop_time = toc;[m
-[32m+[m
-[32m+[m[32m% GOOD: Pagefun (Executes all 10,000 mults simultaneously)[m
-[32m+[m[32mtic;[m
-[32m+[m[32mC_stack = pagefun(@mtimes, A_stack, B_stack);[m
-[32m+[m[32mwait(d);[m
-[32m+[m[32mpagefun_time = toc;[m
-[32m+[m
-[32m+[m[32mfprintf('------------------------------------------------\n');[m
-[32m+[m[32mfprintf('Speedup Factor using pagefun: %.2fx\n', loop_time / pagefun_time);[m
-[32m+[m
-[32m+[m
-[32m+[m[32mfprintf('Total VRAM: %.2f GB\n', d.TotalMemory / 1e9);[m
-[32m+[m[32mfprintf('Available VRAM: %.2f GB\n', d.AvailableMemory / 1e9);[m
-[32m+[m[32mfprintf('Usage: %.1f%%\n', 100 * (1 - d.AvailableMemory / d.TotalMemory));[m
-\ No newline at end of file[m
diff --git a/tore --source rescue-premerge -- CUsersmagfDesktopDesktopMATLAB-ZeugsSilas DSPimdd_simulationClasses b/tore --source rescue-premerge -- CUsersmagfDesktopDesktopMATLAB-ZeugsSilas DSPimdd_simulationClasses
deleted file mode 100644
index 9cb587a..0000000
--- a/tore --source rescue-premerge -- CUsersmagfDesktopDesktopMATLAB-ZeugsSilas DSPimdd_simulationClasses
+++ /dev/null
@@ -1,150 +0,0 @@
-[1mdiff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m[m
-[1mindex e06c41f..f09a03e 100644[m
-[1m--- a/Classes/00_signals/Signal.m[m
-[1m+++ b/Classes/00_signals/Signal.m[m
-[36m@@ -172,11 +172,9 @@[m [mclassdef Signal[m
- [m
- hold on;[m
- if isempty(options.color)[m
-[31m- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);[m
-[31m- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1);[m
-[32m+[m[32m plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);[m[41m
[m
- else[m
-[31m- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);[m
-[31m- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Color',options.color);[m
-[32m+[m[32m plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);[m[41m
[m
- end[m
- % 2 c)[m
- % - xlabel if not already here: time in readable format (1 ms and not 1e-3 s)[m
-[1mdiff --git a/Classes/02_optical/DP_Fiber.m b/Classes/02_optical/DP_Fiber.m[m
-[1mindex a5f3dce..c1f08ea 100644[m
-[1m--- a/Classes/02_optical/DP_Fiber.m[m
-[1m+++ b/Classes/02_optical/DP_Fiber.m[m
-[36m@@ -24,6 +24,8 @@[m [mclassdef DP_Fiber[m
- SS_dzmax % [m] max dz (adaptive SSFM)[m
- SS_dzmin % [m] min dz (adaptive SSFM)[m
- n_waveplates % number of PMD waveplates[m
-[32m+[m[32m useGPU % GPU acceleration: true, false, or 'auto' (default)[m
-[32m+[m[32m useSingle % Use single precision on GPU (default: false)[m
- [m
- % ---- Internal state (persistent between calls) ----[m
- state % struct mirroring legacy 'state'[m
-[36m@@ -56,6 +58,8 @@[m [mclassdef DP_Fiber[m
- options.SS_dzmax = 2e4 % m[m
- options.SS_dzmin = 100 % m[m
- options.n_waveplates = 100[m
-[32m+[m[32m options.useGPU = 'auto' % 'auto', true, or false[m
-[32m+[m[32m options.useSingle = false % single precision GPU[m
- end[m
- [m
- % Copy provided options into properties[m
-[36m@@ -208,7 +212,7 @@[m [mclassdef DP_Fiber[m
- % Frequency-dependent PMD phase term (legacy form)[m
- st.brf.db0 = (R.rand(st.wave_plates,1)*2*pi - pi) * brf_multiplier;[m
- st.brf.db1 = sqrt(3*pi/8)*(st.dgd/obj.fa)/st.wave_plates .* st.omega;[m
-[31m- st.brf.simdgd = 0; [m
-[32m+[m[32m st.brf.simdgd = 0;[m
- % cumsum used in legacy only for debug; keep compatibility variable:[m
- ~cumsum(st.brf.db0); % no-op to mirror legacy path[m
- [m
-[36m@@ -228,7 +232,18 @@[m [mclassdef DP_Fiber[m
- x_in = signal_in(:,1).';[m
- y_in = signal_in(:,2).';[m
- [m
-[31m- [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state);[m
-[32m+[m[32m % Determine GPU usage[m
-[32m+[m[32m if ischar(obj.useGPU) || isstring(obj.useGPU)[m
-[32m+[m[32m if strcmpi(obj.useGPU, 'auto')[m
-[32m+[m[32m gpuFlag = []; % Let CNLSE_plain auto-detect[m
-[32m+[m[32m else[m
-[32m+[m[32m error('DP_Fiber:InvalidGPU', 'useGPU must be true, false, or ''auto''');[m
-[32m+[m[32m end[m
-[32m+[m[32m else[m
-[32m+[m[32m gpuFlag = logical(obj.useGPU);[m
-[32m+[m[32m end[m
-[32m+[m
-[32m+[m[32m [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state, gpuFlag, obj.useSingle);[m
- [m
- obj.state.propagated_length = obj.state.propagated_length + obj.state.L;[m
- [m
-[1mdiff --git a/Classes/02_optical/Optical_Demultiplex.m b/Classes/02_optical/Optical_Demultiplex.m[m
-[1mindex 7d7c39e..8e272d2 100644[m
-[1m--- a/Classes/02_optical/Optical_Demultiplex.m[m
-[1m+++ b/Classes/02_optical/Optical_Demultiplex.m[m
-[36m@@ -42,7 +42,7 @@[m [mclassdef Optical_Demultiplex < handle[m
- [m
- function signalclasses_out = process(obj, signalclass_in)[m
- [m
-[31m- % ---- Infer wavelength: either given or from input total signal [m
-[32m+[m[32m % ---- Infer wavelength: either given or from input total signal[m
- if isempty(obj.wavelengthplan)[m
- obj.wavelengthplan = signalclass_in.lambda; %meter[m
- else[m
-[36m@@ -81,7 +81,7 @@[m [mclassdef Optical_Demultiplex < handle[m
- obj[m
- signal_in[m
- end[m
-[31m- [m
-[32m+[m
- w = obj.fs_out ./ obj.fs_in ;[m
- blocklen_in = length(signal_in);[m
- blocklen_out = w*blocklen_in;[m
-[36m@@ -119,30 +119,31 @@[m [mclassdef Optical_Demultiplex < handle[m
- N = size(lo,1);[m
- C = size(lo,2);[m
- [m
-[31m- x_envelopes = zeros(N, C, 'like', signal_in);[m
-[31m- y_envelopes = zeros(N, C, 'like', signal_in);[m
-[32m+[m[32m % ---- VECTORIZED: Process all channels in parallel ----[m
-[32m+[m[32m % Batched FFT operates on each column simultaneously on GPU[m
- [m
-[31m- s1 = signal_in(:,1);[m
-[31m- s2 = signal_in(:,2);[m
-[32m+[m[32m % Extract polarization signals[m
-[32m+[m[32m s1 = signal_in(:,1); % X polarization [N×1][m
-[32m+[m[32m s2 = signal_in(:,2); % Y polarization [N×1][m
- [m
-[31m- % Reusable work buffers (avoid reallocations)[m
-[31m- wrk_time = zeros(N,1, 'like', signal_in);[m
-[31m- wrk_freq = zeros(N,1, 'like', signal_in);[m
-[32m+[m[32m % Broadcast signal to all channels and multiply with LO[m
-[32m+[m[32m % s1, s2 are [N×1], lo is [N×C] → result is [N×C][m
-[32m+[m[32m x_mixed = att .* s1 .* lo; % [N×C][m
-[32m+[m[32m y_mixed = att .* s2 .* lo; % [N×C][m
-[32m+[m
-[32m+[m[32m % Batched FFT: each column computed in parallel[m
-[32m+[m[32m x_freq = fft(x_mixed); % [N×C][m
-[32m+[m[32m y_freq = fft(y_mixed); % [N×C][m
-[32m+[m
-[32m+[m[32m % Apply filter (H is [N×1], broadcasts across columns)[m
-[32m+[m[32m x_filtered = x_freq .* H; % [N×C][m
-[32m+[m[32m y_filtered = y_freq .* H; % [N×C][m
-[32m+[m
-[32m+[m[32m % Batched IFFT[m
-[32m+[m[32m x_envelopes = ifft(x_filtered); % [N×C][m
-[32m+[m[32m y_envelopes = ifft(y_filtered); % [N×C][m
- [m
-[31m- for c = 1:C[m
-[31m- % ---- X branch ----[m
-[31m- wrk_time(:) = att .* s1 .* lo(:,c); % N×1[m
-[31m- wrk_freq(:) = fft(wrk_time); % N×1[m
-[31m- wrk_freq(:) = wrk_freq .* H; % N×1[m
-[31m- x_envelopes(:,c) = ifft(wrk_freq); % N×1[m
- [m
-[31m- % ---- Y branch ----[m
-[31m- wrk_time(:) = att .* s2 .* lo(:,c);[m
-[31m- wrk_freq(:) = fft(wrk_time);[m
-[31m- wrk_freq(:) = wrk_freq .* H;[m
-[31m- y_envelopes(:,c) = ifft(wrk_freq);[m
-[31m- end[m
-[31m- [m
- end[m
- end[m
- end[m
-[1mdiff --git a/Classes/02_optical/Optical_Multiplex.m b/Classes/02_optical/Optical_Multiplex.m[m
-[1mindex 1d722b0..7fc8a33 100644[m
-[1m--- a/Classes/02_optical/Optical_Multiplex.m[m
-[1m+++ b/Classes/02_optical/Optical_Multiplex.m[m
-[36m@@ -1,10 +1,10 @@[m
- classdef Optical_Multiplex < handle[m
- % Ta
\ No newline at end of file