diff --git a/PROJECT_LOG.md b/PROJECT_LOG.md index f79bd82..4ff4c76 100644 --- a/PROJECT_LOG.md +++ b/PROJECT_LOG.md @@ -2498,3 +2498,40 @@ CSV/JSON, все комплексные статистики CFO, созвезд новых успешных пакетов Lab054 нет. Коммит и push не выполнялись. Следующий этап: STOP и отдельное согласование OFFLINE-оценки качества символов сохранённой ABAB-записи Lab056; Lab058 и новые RF-сеансы автоматически не запускать. + +# Запись 052 + +## Дата + +10 сентября 2026 года + +## Тема + +Lab058 — OFFLINE-анализ качества символов сохранённого ABAB-сеанса Lab056 + +## Выполнено + +После фиксации Lab057 коммитом 5773136ebfa8bafdffc344462d0ce6b56838d3af выполнен +только офлайн-анализ исходных TX/RX Lab056 с повторной проверкой размеров и SHA-256. +Исторические Lab054/Lab056 не изменялись, оборудование не опрашивалось, RF TX=0. + +A1/B1/A2/B2 обработаны отдельно. Receiver-like использует штатные RRC/timing/carrier и +только известную приёмнику 1280-символьную преамбулу; oracle использует TX truth с заранее +разделёнными 64 плитками train/validation и защитными краями. Средний oracle BER A/B +0%/3,4959%, RMS EVM 0,3174/0,8453, matched/residual 9,9685/1,4648 дБ. Receiver-like BER A/B +0,0178%/52,4169%: у B штатный CFO около +4,7 Гц вместо близкого к нулю oracle, что +локализует сильный дополнительный сбой carrier synchronization. + +Eye opening A/B 1,9979/1,9935, но p01 signed margin 0,4231/−0,8195. Фиксированный ISI +−5…+5 дал adjacent/main −33,3195/−30,1006 дБ. Усреднённая H(f) дала робастный ripple +0,4067/5,4714 дБ; источник внутри общего OTA TX–канал–RX пути не разделён, group-delay +variation неустойчива. TX control BER 0/0; AWGN control при одинаковой sampled noise PSD +ухудшил EVM B/A на 13,17 дБ в ожидаемую сторону; background дал BER около 50%. + +Результат MIXED: энергия символа и широкополосная неравномерность ухудшают физическое +качество B, а текущая синхронизация ухудшает его ещё сильнее. Lab054 остаётся NOT_A, +0/16. Lab058 не коммитилась, push не выполнялся. + +Следующий этап: отдельно согласовать полностью офлайн-проверку исправленного preamble-only +CFO/carrier estimator на сохранённых Lab056, Lab054 и контролях, без payload truth в +оценивателе и без запуска Lab059 автоматически. diff --git a/data/processed/lab058/channel_response.csv b/data/processed/lab058/channel_response.csv new file mode 100644 index 0000000..2f0d605 --- /dev/null +++ b/data/processed/lab058/channel_response.csv @@ -0,0 +1,1087 @@ +label,frequency_hz,gain_db,phase_residual_rad,coherence +A1,-12695.3125,-37.811560323678506,0.023198293057282715,0.5296632168128007 +A1,-11718.75,-37.464861173743444,-0.007495451967155287,0.7871469168713103 +A1,-10742.1875,-37.70238371012996,0.0061391460033064504,0.8601766544057343 +A1,-9765.625,-37.93380369012055,0.00012510593709702533,0.8910118701986546 +A1,-8789.0625,-37.90525525362037,-0.011056611409120176,0.901367775383948 +A1,-7812.5,-37.731137665523214,-0.00661420859401618,0.9124738286444076 +A1,-6835.9375,-37.83968387033867,0.0023564985948558714,0.9170029388996696 +A1,-5859.375,-37.980078850971324,0.005465691629608749,0.9149167986410766 +A1,-4882.8125,-37.991963209563856,-0.001844714343705256,0.9125871507178897 +A1,-3906.25,-38.03167989668746,-0.0018258189497664112,0.9103441040732423 +A1,-2929.6875,-37.96505759408757,-0.00474085385803269,0.9006287728470576 +A1,-1953.125,-37.98081834953666,-0.0024339628259673063,0.8988051702348652 +A1,-976.5625,-37.92576569667596,0.028890839511124256,0.9075539904532669 +A1,0.0,-37.906116624821884,-0.044903321257285356,0.9131729379332619 +A1,976.5625,-38.15130644486487,0.029136368458686945,0.9104742642303186 +A1,1953.125,-37.945320406763564,-0.008849373351789591,0.9161064449257451 +A1,2929.6875,-37.900229195597205,-0.01353726002807809,0.9142445231400685 +A1,3906.25,-37.90137068148746,-0.009578205433922182,0.9136315034125109 +A1,4882.8125,-37.93989333242571,-0.007297998898594393,0.9028833399859683 +A1,5859.375,-38.013220790783684,-0.001807532208569107,0.8920751245349335 +A1,6835.9375,-38.055157158056446,0.007336497315231227,0.8946267879604141 +A1,7812.5,-38.108470061553746,-0.010371033759878578,0.9085862683458887 +A1,8789.0625,-38.096210144278906,0.01361459758526129,0.9097519445694577 +A1,9765.625,-37.92735996297016,-0.004438691461620348,0.9065285470486301 +A1,10742.1875,-37.80227802579472,-0.0041369786453571145,0.8810749311009343 +A1,11718.75,-37.86748182632334,0.03634544275500495,0.7649756970000513 +A1,12695.3125,-38.409481283415055,-0.01167646385458454,0.42560140269398644 +B1,-323242.1875,-38.33377745585233,-0.04993701846220633,0.1556122634783969 +B1,-322265.625,-37.886383702254726,0.04606039388653915,0.1446251959149753 +B1,-319335.9375,-38.27209192457079,-0.08469938883812667,0.21889051968992446 +B1,-318359.375,-37.97445046540676,-0.08394995029950758,0.20909674768682796 +B1,-315429.6875,-37.78881685205939,-0.10076681378057728,0.2747676073417175 +B1,-314453.125,-37.470881676034,-0.09855051157859318,0.278797436410958 +B1,-311523.4375,-38.96061880059281,-0.061434467138389515,0.2651025143312618 +B1,-310546.875,-38.935697522268626,-0.058412504406071264,0.28352977252857203 +B1,-307617.1875,-37.58819087968512,-0.06587654055709224,0.3881902537844143 +B1,-306640.625,-37.21019034700377,-0.08978039821902639,0.42070359327140966 +B1,-303710.9375,-37.884550410258704,-0.07933124822400206,0.39578288235443904 +B1,-302734.375,-37.62891605099345,-0.06827944657794482,0.4911031668294284 +B1,-299804.6875,-38.42166591818334,-0.07372017541009468,0.424370275075182 +B1,-298828.125,-38.184211481191205,-0.06903648903615034,0.5175179104874166 +B1,-295898.4375,-38.1636677837393,-0.002886160792418657,0.4907317304618238 +B1,-294921.875,-38.12402144391947,-0.030880550748340507,0.6083758054720281 +B1,-291992.1875,-38.0526006731105,-0.02545794718729555,0.5174112738957057 +B1,-291015.625,-37.89424968326975,-0.038231269992961,0.6346685711442241 +B1,-290039.0625,-37.489102412443025,0.09770027262814462,0.13769660536397438 +B1,-288085.9375,-38.925213640571016,0.011711675251646625,0.4956478302533884 +B1,-287109.375,-38.449516138860986,-0.00713386882578293,0.6617701343389886 +B1,-286132.8125,-36.59333424990786,0.22855126687305027,0.22647583840619298 +B1,-284179.6875,-38.169520854951664,-0.024562933475183346,0.5257766606456805 +B1,-283203.125,-37.9431286664776,-0.06420922636056714,0.683370843694152 +B1,-282226.5625,-36.6495127750757,-0.04429610989596311,0.2485404920850795 +B1,-280273.4375,-38.387951340770464,-0.0016558415496432666,0.5116066002499023 +B1,-279296.875,-37.99197584506498,-0.02110362784112585,0.7356494787555122 +B1,-278320.3125,-36.200810773524736,0.07253833562958256,0.35821875559930794 +B1,-276367.1875,-38.39631148684286,-0.025049221615141448,0.536360745314126 +B1,-275390.625,-38.020471963290476,-0.06274885178829548,0.7527323432157438 +B1,-274414.0625,-37.907198104533876,0.06532606451367684,0.28778320314422673 +B1,-272460.9375,-38.03098496459765,-0.039084584484585516,0.5718227820243603 +B1,-271484.375,-38.016631939845226,-0.06383144265284502,0.7716418523974599 +B1,-270507.8125,-37.698954974382445,0.09533894715947033,0.3248222529185862 +B1,-268554.6875,-38.523508047788255,-0.02325950149442546,0.5373885140011777 +B1,-267578.125,-38.18700807462358,-0.07156538011084645,0.7907932774122207 +B1,-266601.5625,-38.034162600732294,0.03239838514352966,0.37572387505505184 +B1,-264648.4375,-38.333108976305155,-0.009574825296781775,0.5632352563792924 +B1,-263671.875,-37.918536568759606,-0.0566315738165577,0.8175452810721361 +B1,-262695.3125,-37.34403327577895,-0.021191314442320586,0.473398509758914 +B1,-260742.1875,-38.55896229290759,0.0001726696918411541,0.4438696543491307 +B1,-259765.625,-38.150108936344964,-0.05360003817734915,0.6487414106770447 +B1,-258789.0625,-37.460610891003235,0.031820670775259075,0.21786749933226124 +B1,-256835.9375,-39.300557273566234,-0.04948593007030455,0.21800039017625553 +B1,-255859.375,-38.531009388245586,-0.07285960872957631,0.663053981228812 +B1,-254882.8125,-38.219831438066606,0.01077924584402723,0.40103078722022484 +B1,-252929.6875,-38.37638067946381,0.03154219898914423,0.42346004654142344 +B1,-251953.125,-38.03389486605002,-0.048889271039974425,0.741199931114524 +B1,-250976.5625,-37.69357409724633,0.0070790802404592235,0.4024507825332319 +B1,-249023.4375,-38.73449316455263,0.007469368914905239,0.4367152168587249 +B1,-248046.875,-38.05703712929517,-0.05648061811818339,0.8324674636945272 +B1,-247070.3125,-38.02609399550011,-0.00045461190447193545,0.5808226083544699 +B1,-245117.1875,-38.466408366680454,0.0710866565838737,0.4236482088352295 +B1,-244140.625,-38.07971209585898,-0.03634499461116203,0.8017986618935107 +B1,-243164.0625,-37.40974763015956,0.014069907570017026,0.5731289906467976 +B1,-241210.9375,-38.6075746837962,0.01179991748764353,0.42807450902503613 +B1,-240234.375,-38.063058781958844,-0.05006111281393233,0.8405146459396697 +B1,-239257.8125,-37.64870120641445,-0.02162140812714597,0.6342905407570091 +B1,-237304.6875,-38.239376297018424,0.09132245771783287,0.4484581645701266 +B1,-236328.125,-37.91308471308942,-0.03442601920248611,0.8548727659496245 +B1,-235351.5625,-37.40314315507935,0.006450913481812481,0.6702409252795455 +B1,-233398.4375,-39.08032975397271,0.02302036604850466,0.35658409829117405 +B1,-232421.875,-38.24945210579741,-0.06453518407397185,0.8446152480529505 +B1,-231445.3125,-38.20520855431449,0.013578492613783855,0.6982728105121707 +B1,-229492.1875,-38.89285280805788,0.0034905822192543567,0.38057482427808126 +B1,-228515.625,-37.907847933488334,-0.06265647793996898,0.8549782950900289 +B1,-227539.0625,-37.61290047144822,-0.024861273437217335,0.7144071746532833 +B1,-225585.9375,-38.63617204402551,0.074397434653664,0.3262410094170302 +B1,-224609.375,-37.875325194639814,-0.0503079166037157,0.8279538049737354 +B1,-223632.8125,-37.4604281970612,-0.015142224611596422,0.7507187724424365 +B1,-221679.6875,-39.502661981887485,0.08510814330865424,0.2863982860069258 +B1,-220703.125,-38.47172317734823,-0.04947446179507553,0.8350972521116005 +B1,-219726.5625,-38.118068948886076,-0.0024524571342872115,0.7276673828320099 +B1,-217773.4375,-40.076068669517255,0.0953355036221919,0.25332892520420724 +B1,-216796.875,-38.08368904533094,-0.03675993397653876,0.8423594430227335 +B1,-215820.3125,-37.828055804353255,0.004810780963685701,0.7692556541577087 +B1,-213867.1875,-39.61483228885433,0.06818419684908861,0.22403319122750023 +B1,-212890.625,-38.0471970384981,-0.0858490748446008,0.8104951907475187 +B1,-211914.0625,-37.87482764337969,-0.07588423124168342,0.7378761333770726 +B1,-209960.9375,-39.399284074879134,0.0460667918854516,0.1906907245060327 +B1,-208984.375,-37.79806688854426,-0.08662557756202816,0.8055447012054726 +B1,-208007.8125,-37.68669359088925,-0.06830299422787212,0.7339129423263574 +B1,-206054.6875,-39.17271419510523,0.10576649363826496,0.17821775413877997 +B1,-205078.125,-38.07522944152111,-0.04171246893236802,0.7918113762047397 +B1,-204101.5625,-37.924452258923424,-0.021519845548598315,0.7327835297772656 +B1,-203125.0,-34.76135885045195,0.3440736337167709,0.10037414881352487 +B1,-202148.4375,-39.10415320218328,0.08008005649254946,0.15614202163024304 +B1,-201171.875,-37.918307508526695,-0.04902942315099734,0.8025755215877758 +B1,-200195.3125,-37.73800919644884,-0.029625346037765787,0.7790842656445638 +B1,-199218.75,-34.338270046911845,0.29196877307907565,0.15292991559651367 +B1,-198242.1875,-40.29915487103259,0.0706415953316939,0.12394164943592244 +B1,-197265.625,-38.254052046954726,-0.08964072112788202,0.8166001008123724 +B1,-196289.0625,-38.01613759116836,-0.07877560284813878,0.8072135657876491 +B1,-195312.5,-34.49014435789294,0.16422555580638942,0.19797381028094527 +B1,-194335.9375,-40.70181423836197,0.11975140001773532,0.0947165037002462 +B1,-193359.375,-38.19174232108676,-0.06271244728499736,0.8075220887366007 +B1,-192382.8125,-37.963083895566484,-0.0630701996789087,0.8322246334565871 +B1,-191406.25,-35.23630688735686,0.03694235807369406,0.23455781965431313 +B1,-190429.6875,-40.729713596095095,0.20164402946137283,0.09936168509036336 +B1,-189453.125,-38.19511780899581,-0.05259831524757086,0.8094551595676172 +B1,-188476.5625,-37.993890480015196,-0.050940596027098106,0.8320730264169317 +B1,-187500.0,-35.82323383611034,0.13207306166109944,0.23189375170781665 +B1,-186523.4375,-41.13119387295826,-0.06182655876732346,0.06768322880194247 +B1,-185546.875,-38.18739382597083,-0.08652026313031547,0.7959740443554589 +B1,-184570.3125,-38.048595079839146,-0.07668597364340535,0.8345387672146055 +B1,-183593.75,-36.827135881244374,0.1248688323733953,0.2501345605956621 +B1,-182617.1875,-40.12155125951578,0.1311204994168791,0.08799662703879121 +B1,-181640.625,-38.0803917800766,-0.06461789479812907,0.8148676683552138 +B1,-180664.0625,-37.975639298164815,-0.06291509915743942,0.8450658255379636 +B1,-179687.5,-37.17655610698069,0.13153285594775221,0.2417767111604611 +B1,-178710.9375,-43.9588904587287,0.37244796533407154,0.02520905747716185 +B1,-177734.375,-38.12990742437022,-0.05493802106543866,0.7774926120170109 +B1,-176757.8125,-37.90456731481362,-0.04872960815326399,0.8525414368994213 +B1,-175781.25,-36.65488819945709,0.2933331212579775,0.31621310068278086 +B1,-174804.6875,-44.714027162763884,0.19928616307153968,0.018896289227486856 +B1,-173828.125,-38.20841360958179,-0.05946500751485262,0.7984646166409327 +B1,-172851.5625,-37.91681470029038,-0.06931657268405766,0.8608297998376235 +B1,-171875.0,-36.221855817035696,0.010395315806230432,0.3533423587107736 +B1,-170898.4375,-47.21360390576511,0.7511094134911267,0.007613222788209341 +B1,-169921.875,-38.37880893953005,-0.04290049174926347,0.7303951967086757 +B1,-168945.3125,-38.10762957914866,-0.04344594997772511,0.8399186731064854 +B1,-167968.75,-36.92604461535537,0.18494506729107218,0.34517844378201445 +B1,-166015.625,-38.17661699394096,-0.0597655119736471,0.7604767763511889 +B1,-165039.0625,-37.98516010407184,-0.06772946958206205,0.8510106816993074 +B1,-164062.5,-36.20639077357265,0.13528120097389085,0.3831510002459396 +B1,-162109.375,-38.51871288432635,-0.03225457191241832,0.6969023395132967 +B1,-161132.8125,-38.17791781551798,-0.05788457140374481,0.8289763406389935 +B1,-160156.25,-36.56210239643174,0.1294596552296805,0.4245841827884103 +B1,-158203.125,-38.32647672575759,-0.06057575326612108,0.7019870699853642 +B1,-157226.5625,-37.99403230068193,-0.07774875676824688,0.8407944718375351 +B1,-156250.0,-37.06762615044683,0.021588088129497418,0.2952899851366096 +B1,-154296.875,-38.47421708357651,-0.027617080551460393,0.3729557795892371 +B1,-153320.3125,-38.17045315506348,-0.053700331123049505,0.602611360162343 +B1,-152343.75,-37.34317209762201,0.0959290249892546,0.24244429531837297 +B1,-150390.625,-38.07748407838927,-0.005432350648510997,0.589821737377892 +B1,-149414.0625,-37.91489757707123,-0.043832319098963346,0.7847525627371387 +B1,-148437.5,-37.495087107083144,0.08692407034288241,0.30723134390303997 +B1,-146484.375,-38.46065950767731,-0.09151636411989816,0.46013344723571314 +B1,-145507.8125,-38.02806331105427,-0.10750901258406653,0.7891679736002473 +B1,-144531.25,-37.11062667312047,0.047841890638371076,0.45625151899828814 +B1,-142578.125,-38.117178042333464,-0.019508072144546862,0.6162582179448276 +B1,-141601.5625,-37.953813549299056,-0.06996994164164017,0.8368740275133025 +B1,-140625.0,-37.22600942742398,0.03709424513367665,0.443670613928938 +B1,-138671.875,-38.33511508019974,-0.012299857273128545,0.47400480144652435 +B1,-137695.3125,-38.07037975664506,-0.06595294033183441,0.7747919674804851 +B1,-136718.75,-37.63618090281283,-0.0017943489111162947,0.47151536904365976 +B1,-134765.625,-38.532677837192786,-0.008423858432408782,0.5260062997299914 +B1,-133789.0625,-38.150690954534554,-0.07916423944350459,0.8089635851631632 +B1,-132812.5,-37.43491769109539,-0.0019522900439290503,0.4947470048520776 +B1,-130859.375,-38.380108522392746,0.06260889963768612,0.39190702821568996 +B1,-129882.8125,-37.838284157152344,-0.040071510127884125,0.7199875038028296 +B1,-128906.25,-37.18074412375232,0.052370382125007,0.454270328139494 +B1,-126953.125,-38.25475427815869,-0.03657322935162943,0.5023761044343521 +B1,-125976.5625,-37.86320598392311,-0.07174299351802871,0.7944587781936684 +B1,-125000.0,-37.10964862672241,-0.012272904065583123,0.5252695758651553 +B1,-123046.875,-38.317796690954694,-0.0350489341196587,0.33350964613803963 +B1,-122070.3125,-38.20868705854068,-0.0664943588366933,0.6650695341015004 +B1,-121093.75,-37.74158655260186,0.016270486070336432,0.40329489975120075 +B1,-119140.625,-38.21437202853883,-0.02775278185410812,0.4283010686166896 +B1,-118164.0625,-37.936748194441904,-0.11334557909712872,0.8046683611171758 +B1,-117187.5,-37.58604555972764,-0.07957834901839611,0.529957020156747 +B1,-115234.375,-38.14272531833304,-0.027493428039694123,0.2903257723294857 +B1,-114257.8125,-37.821783896997495,-0.08318932668313206,0.6416748656399265 +B1,-113281.25,-37.56708580511857,-0.030590881050376773,0.3666813060282913 +B1,-111328.125,-38.67956806044336,0.004716658542690322,0.29607503691345016 +B1,-110351.5625,-38.055623379054076,-0.09175525678168395,0.7835920930490718 +B1,-109375.0,-37.67594016389089,-0.04226901361840385,0.6042587863886963 +B1,-107421.875,-38.914425421811266,-0.09680489205703857,0.21117682460635642 +B1,-106445.3125,-37.87035376482406,-0.06506444499327779,0.5926954302677334 +B1,-105468.75,-37.59917476346761,-0.031757202297376,0.34901795157385346 +B1,-103515.625,-38.66419160239451,0.0631529254332941,0.2706667971857506 +B1,-102539.0625,-38.04149241998449,-0.03916545951855488,0.770464782788421 +B1,-101562.5,-37.851998345917536,-0.0010279870060192486,0.562486015780243 +B1,-99609.375,-39.32019659835826,0.10761170852102442,0.18605859359522678 +B1,-98632.8125,-37.886201380666485,-0.0348433537776871,0.586074197949925 +B1,-97656.25,-37.48400020216268,0.0009447920522811515,0.40436003108344604 +B1,-95703.125,-40.00410611701238,0.08323185400484556,0.18313428558598818 +B1,-94726.5625,-38.415723186610606,-0.11009456643531745,0.7434891364561691 +B1,-93750.0,-38.14325021475269,-0.06331955629207275,0.6205072394297882 +B1,-91796.875,-39.94246867719293,0.060310196297220564,0.1626111043381137 +B1,-90820.3125,-38.24091886882867,-0.07228365966023542,0.7164606826103738 +B1,-89843.75,-37.94247526766394,-0.05156785024178756,0.5795183964236105 +B1,-87890.625,-37.93252656572808,0.11841977977403051,0.21187822122776434 +B1,-86914.0625,-38.08162942142858,-0.05482964567139392,0.7592701008098582 +B1,-85937.5,-37.83865603514487,-0.04209160067533757,0.6951630429594238 +B1,-83984.375,-38.63894257559434,-0.06507653026541504,0.16534801881407424 +B1,-83007.8125,-37.849023440368995,-0.10467268214277148,0.7550199759342598 +B1,-82031.25,-37.6747025329537,-0.07692320637236527,0.6772990411961752 +B1,-80078.125,-40.72780942804883,0.2681540412404142,0.1000267259941772 +B1,-79101.5625,-38.12186363076633,-0.12901064609252888,0.7415385342063499 +B1,-78125.0,-37.915798666416094,-0.10025456719330705,0.6854967269292291 +B1,-77148.4375,-33.644233641497884,0.48017487787368207,0.1171782511107221 +B1,-76171.875,-39.99782700988221,0.035827208298925495,0.1027948609367824 +B1,-75195.3125,-38.38123861980136,-0.09444458292745717,0.7280891720480388 +B1,-74218.75,-38.011513298241894,-0.0877895583462922,0.6739180115673271 +B1,-73242.1875,-32.82462477589025,0.02516878065493211,0.14101480625312518 +B1,-72265.625,-40.75926253887856,0.15919973435007773,0.07274903758966185 +B1,-71289.0625,-38.2237297988273,-0.1107527723828663,0.7230996886289148 +B1,-70312.5,-38.03014429119357,-0.09502732602571573,0.7061457668955722 +B1,-69335.9375,-35.162899818076994,0.2424476770912829,0.11872883793202688 +B1,-68359.375,-39.53239383115025,0.13619730751698267,0.08061303198394036 +B1,-67382.8125,-37.84999425860641,-0.10240775197739183,0.726495858104113 +B1,-66406.25,-37.71003694969457,-0.10291191531795185,0.6851030201561016 +B1,-65429.6875,-35.41596118983936,0.05340898196132615,0.09617504371486932 +B1,-64453.125,-42.39541866244109,0.41853700887871126,0.026555398978232916 +B1,-63476.5625,-38.51271211616111,-0.13471970086612695,0.6732502103035936 +B1,-62500.0,-38.16344557738681,-0.1321555286577616,0.7185195236515244 +B1,-61523.4375,-34.65120684066861,0.12226835531756386,0.186615097302189 +B1,-60546.875,-44.27957109101105,0.04149127025731314,0.01823874105426496 +B1,-59570.3125,-38.23933231508811,-0.1961493173800113,0.629175182712754 +B1,-58593.75,-37.981326092589214,-0.18749703536275764,0.6476249094784592 +B1,-57617.1875,-35.448159510892594,0.05509758832440648,0.12788894391356367 +B1,-56640.625,-54.26448697059336,-0.39949523766722117,0.0011498453649869675 +B1,-55664.0625,-38.39398139489764,-0.3234426982471894,0.6284230388481218 +B1,-54687.5,-37.917372969007,-0.3201534508549502,0.7099611949949486 +B1,-53710.9375,-35.41487057814149,-0.15475468791690572,0.19084617111924368 +B1,-52734.375,-46.68342202068412,-1.6027643889639078,0.00759388708239668 +B1,-51757.8125,-41.09684196497295,-1.0073845185750896,0.4143198931739659 +B1,-50781.25,-41.02135040676928,-0.9985578543848492,0.46798188678253094 +B1,-49804.6875,-43.347748023037234,-0.9855073960079774,0.05028744746026007 +B1,-48828.125,-43.226598380392886,0.1863291501338331,0.009798082011594897 +B1,-47851.5625,-38.838796347590325,0.3447711620812792,0.5936077964165778 +B1,-46875.0,-38.64220827809979,0.35207932809041687,0.6695784355218455 +B1,-45898.4375,-37.18353950766276,0.5398817693681104,0.15287508961377821 +B1,-44921.875,-49.401464036517424,-0.03300470662244148,0.0018956724156953453 +B1,-43945.3125,-38.318383647497576,0.14478698901257347,0.5482167884906807 +B1,-42968.75,-37.97019607901938,0.15238562859082538,0.67317992049413 +B1,-41992.1875,-36.18230229794821,0.3232524230130469,0.18437844640176967 +B1,-40039.0625,-38.257455063244244,0.059811603981612116,0.5319357026104196 +B1,-39062.5,-38.115776723423224,0.030075391565914433,0.6652553071001124 +B1,-38085.9375,-37.37334397197018,0.026027743721332097,0.16105376740627053 +B1,-36132.8125,-38.29118463706296,0.07390353779882775,0.5201348724503982 +B1,-35156.25,-37.809111921092125,0.06138871832697523,0.7060590228223835 +B1,-34179.6875,-36.26260238736914,0.16926529223544984,0.23480247592201883 +B1,-32226.5625,-38.25258695390927,0.024233883095302833,0.5849422063363139 +B1,-31250.0,-37.79321716110875,0.004990854323274618,0.7887612211826067 +B1,-30273.4375,-36.553995215272124,0.08204903058696944,0.33128196252736875 +B1,-28320.3125,-38.156429717161984,0.017489559804152677,0.5678313027986976 +B1,-27343.75,-37.84340315981957,-0.011089628320070766,0.7518512259755828 +B1,-26367.1875,-37.4567709805811,0.12227040457063021,0.2688804390620541 +B1,-24414.0625,-38.359951906358226,-0.01715414746587074,0.5648048413474476 +B1,-23437.5,-37.87716908095431,-0.03284135103603658,0.8010093121456238 +B1,-22460.9375,-37.02919531244205,0.10737236132428718,0.3772106014298834 +B1,-20507.8125,-38.49220371019585,-0.05052070021421606,0.5713878651805347 +B1,-19531.25,-38.203372321633566,-0.060879005381502704,0.7929870507683786 +B1,-18554.6875,-37.742586504159,0.029873382644958202,0.3661026254173299 +B1,-16601.5625,-38.60052234467116,-0.0267077066882786,0.5355756975248214 +B1,-15625.0,-38.02746182410414,-0.049556391383735576,0.8172376929211626 +B1,-14648.4375,-37.19947845681935,0.04265760831738907,0.44763971441386563 +B1,-12695.3125,-38.01383113601561,0.0021029674479495775,0.5516061709436018 +B1,-11718.75,-37.87717017918516,-0.045921004221635364,0.7751274353545112 +B1,-10742.1875,-37.561704498338166,0.05215491068825617,0.3834369978714197 +B1,-8789.0625,-38.83771345164121,-0.006530715238727058,0.45439141454487986 +B1,-7812.5,-38.04649549474581,-0.04384346929876903,0.8083630665919125 +B1,-6835.9375,-37.900312850970835,0.037875004886049,0.464322908936603 +B1,-4882.8125,-38.159551877957895,-0.039548422731950694,0.5279244761235374 +B1,-3906.25,-37.73748596249188,-0.07141150276999131,0.7944460842164025 +B1,-2929.6875,-37.117916276231256,0.034285991515381475,0.38630079245589366 +B1,2929.6875,-38.91881235251387,0.060117323867724615,0.3799549041058495 +B1,3906.25,-38.052854466366966,-0.04854892315589865,0.7445841978458531 +B1,4882.8125,-37.497716654716335,0.02940159495971173,0.3628968224717282 +B1,6835.9375,-38.46194369807559,0.044491516203042814,0.27069268911956934 +B1,7812.5,-37.931231410229955,-0.05132172404015689,0.7606159169164057 +B1,8789.0625,-37.35659465273753,0.010845703249739103,0.5582752610582948 +B1,10742.1875,-38.85569502013186,0.08451704943056582,0.3430840662958655 +B1,11718.75,-37.9843334117426,-0.015994086259145224,0.7525590736729234 +B1,12695.3125,-37.78924521299711,0.03514265028018393,0.43570288857375733 +B1,14648.4375,-38.67331589611995,-0.008110032957331814,0.22485966274212124 +B1,15625.0,-37.887319269979265,-0.052087728700970004,0.7384924984967768 +B1,16601.5625,-37.46095219042299,-0.02670235709182789,0.6056385798198626 +B1,18554.6875,-38.697594841527916,0.07578357288792104,0.3161173973548667 +B1,19531.25,-38.129925604134655,-0.045767980298037525,0.7724084674572574 +B1,20507.8125,-37.68478359074195,-0.02920894085341974,0.542902571789793 +B1,22460.9375,-39.48283120738485,0.14627272090955667,0.17555572435861128 +B1,23437.5,-37.919277928395026,-0.015034049995791499,0.7486037076005204 +B1,24414.0625,-37.527003094239085,0.016186763437663565,0.6407701094574624 +B1,26367.1875,-38.76791150251054,-0.029247962146587092,0.30845288276019356 +B1,27343.75,-37.99987694662641,-0.09906028668514022,0.806117029492824 +B1,28320.3125,-37.76552202948128,-0.045202482044921055,0.6293528499644899 +B1,30273.4375,-40.09699950609071,0.05181646254800265,0.14272420786169368 +B1,31250.0,-38.34071234112906,-0.05526443665357794,0.7210058111269496 +B1,32226.5625,-37.99088211883397,-0.025360768368567044,0.6375500942905498 +B1,34179.6875,-40.35970839482604,0.03884775486294334,0.130303428911677 +B1,35156.25,-38.171788443145076,-0.08704379597531453,0.7649848192118315 +B1,36132.8125,-37.97804913422325,-0.06116860239899591,0.682089845544785 +B1,38085.9375,-39.96284546895427,-0.037775426766908815,0.13882776347670747 +B1,39062.5,-38.37025966941137,-0.0775935216944239,0.7331923282390431 +B1,40039.0625,-38.23633770338748,-0.04639135258333793,0.6813802481971363 +B1,41992.1875,-40.29268679564044,0.21379006245328336,0.16816494364511156 +B1,42968.75,-38.20449790977298,-0.03536345380586914,0.81023931249042 +B1,43945.3125,-37.92920170963058,-0.010120567914489342,0.760234277973641 +B1,44921.875,-33.60317384914192,0.40559022420553825,0.1357760200673979 +B1,45898.4375,-38.75968079447004,0.10639192302728961,0.1500413627508062 +B1,46875.0,-38.00771353343295,-0.048905096784546576,0.7405849200828408 +B1,47851.5625,-37.832496839674526,-0.04414643199532131,0.7084635408728457 +B1,48828.125,-34.2152658420772,0.03318275762286538,0.10488965559721052 +B1,49804.6875,-40.82612128695927,0.2999930909468125,0.07433034419459025 +B1,50781.25,-38.34054698581698,-0.049001885914879306,0.7469123607758542 +B1,51757.8125,-38.0570629027146,-0.0438883898149256,0.6648168169468861 +B1,52734.375,-34.309408475434935,0.1856257626643134,0.06853130712382124 +B1,53710.9375,-40.05953223710495,0.18033859931196128,0.03535808925050457 +B1,54687.5,-37.770429834489995,-0.045141214076102276,0.5677436966100181 +B1,55664.0625,-37.553330542503254,-0.036554901225579695,0.6481606285735982 +B1,56640.625,-34.87841656204747,0.2109352489849825,0.14004990886930144 +B1,57617.1875,-40.18857498695287,0.0031573422363284642,0.0869518620330053 +B1,58593.75,-38.058361538045496,-0.05538653283534334,0.7982358314095225 +B1,59570.3125,-37.82567291646841,-0.04661281506302206,0.8364955599050791 +B1,60546.875,-34.43805448582016,0.09702320118662966,0.2891130501551637 +B1,61523.4375,-42.7049419654578,0.6732335963720599,0.05253447381327692 +B1,62500.0,-38.30821436994062,-0.05033611527947457,0.7905036165410099 +B1,63476.5625,-37.941640665861215,-0.0497199140179263,0.8366784316993213 +B1,64453.125,-34.65655301087312,0.22332057020500118,0.2954784156474552 +B1,65429.6875,-41.72120189499794,0.32677745369339695,0.05602649807269922 +B1,66406.25,-38.30926316857042,-0.041247180028214814,0.8036302455017292 +B1,67382.8125,-38.200411991773684,-0.04205442394318837,0.8409403088515915 +B1,68359.375,-37.6255602649273,0.1803949154918265,0.21092733077996365 +B1,69335.9375,-39.07794893120557,0.5848023329104985,0.08178015320453709 +B1,70312.5,-38.2885844925942,-0.02081522384558898,0.7807845027534537 +B1,71289.0625,-38.1528441154687,-0.04112446717885598,0.8356878895713421 +B1,72265.625,-37.04426300626523,0.10065766139397114,0.2705708937883785 +B1,73242.1875,-45.924850414358396,0.44412459383554426,0.016521325993536146 +B1,74218.75,-38.56747296036421,-0.052739207448585734,0.7817535611601131 +B1,75195.3125,-38.23287322361076,-0.05546962502105535,0.8536936073041299 +B1,76171.875,-36.44103024595702,0.0989995275511677,0.3417163452036036 +B1,77148.4375,-42.90102028172126,0.5975688190926851,0.026388539379774038 +B1,78125.0,-38.19202605135599,-0.02536316664510574,0.7814509295438156 +B1,79101.5625,-37.98916677040242,-0.0317953119041432,0.8503854617304362 +B1,80078.125,-36.51014102907745,0.1978895242534091,0.3720691464988362 +B1,82031.25,-38.442524863605016,-0.05605243867245324,0.7494172005647255 +B1,83007.8125,-38.17007656377602,-0.062358266214964875,0.8487726946144413 +B1,83984.375,-37.31557119417144,0.10179180448821556,0.37087605117115013 +B1,85937.5,-38.314271933556,-0.04613403690778828,0.7562974369487561 +B1,86914.0625,-37.966794802159555,-0.05423900698693318,0.8707754959947053 +B1,87890.625,-36.877421698972896,0.15046567174680048,0.40974485471713684 +B1,89843.75,-38.32346085783986,-0.03928254032602041,0.7534954445912144 +B1,90820.3125,-37.93087991580456,-0.05688334984919852,0.8713971691630255 +B1,91796.875,-36.87845329651507,0.04431126749088321,0.4278188313175813 +B1,93750.0,-38.391516673264704,-0.0005296608047102858,0.6867769319330043 +B1,94726.5625,-38.091498468950796,-0.03666672186345732,0.8414303429101121 +B1,95703.125,-36.77802858067932,0.10791093800734863,0.44661240271966 +B1,97656.25,-38.62071990788805,-0.008887262998863221,0.6817779739868637 +B1,98632.8125,-38.24834794549012,-0.041690398195719514,0.8804004051532794 +B1,99609.375,-37.206585038466685,0.11975418257182557,0.5268506121976837 +B1,101562.5,-38.22789482370268,-0.02608866688657674,0.7155212497143056 +B1,102539.0625,-38.05006597786534,-0.044713023939083385,0.8625568502102351 +B1,103515.625,-37.10682379283614,0.12435930332768219,0.5302350190736927 +B1,105468.75,-38.17455767492423,-0.03556242574613133,0.6910269562135164 +B1,106445.3125,-37.96653462018178,-0.06281455811748282,0.8863620077356722 +B1,107421.875,-37.00406717849206,0.0005778751990077602,0.5700086880706906 +B1,109375.0,-38.82712554272341,-0.02008769338962413,0.6080052772876712 +B1,110351.5625,-38.25676401956851,-0.07204323101767551,0.8627417664167943 +B1,111328.125,-37.62846125660731,0.0607081308315327,0.5660757397151822 +B1,113281.25,-38.33097812141551,-0.07066466023468054,0.667073040546182 +B1,114257.8125,-37.97658874400164,-0.0856137172319884,0.8812478202735924 +B1,115234.375,-37.5355410766806,-0.003380844308351172,0.6051278302916597 +B1,117187.5,-38.591453506013956,-0.05440950489093632,0.5782757094342558 +B1,118164.0625,-38.12499762042431,-0.0766528131593116,0.8636433031019034 +B1,119140.625,-37.78318086192394,-0.011616133296036502,0.5889629576110288 +B1,121093.75,-38.80755023194017,-0.018776458539211838,0.591525488979713 +B1,122070.3125,-38.31854687250007,-0.05646460237830064,0.875608956355765 +B1,123046.875,-37.94752263193121,-0.00347416878668394,0.6205420440671883 +B1,125000.0,-39.41991802936958,-0.03242142012906557,0.4189023845673827 +B1,125976.5625,-38.452010908536444,-0.06514689165358556,0.7906979975600154 +B1,126953.125,-38.183957811918184,-0.0020263632923565034,0.5114201358290985 +B1,128906.25,-38.84617810482277,0.00788543490554261,0.4613402548958297 +B1,129882.8125,-38.2389649738096,-0.054889190342033434,0.8471082827978751 +B1,130859.375,-37.69352611342044,0.02683012361946968,0.6433106091418299 +B1,132812.5,-38.57738861819546,0.051190274126419855,0.48314849269843396 +B1,133789.0625,-37.95128420679382,-0.05666461276479717,0.8659459702386305 +B1,134765.625,-37.577729744076244,0.029219817934776238,0.6992228240841062 +B1,136718.75,-38.41070862473748,-0.02301175118219545,0.5154638310158178 +B1,137695.3125,-37.951428095346564,-0.07921055587633008,0.8795058438997102 +B1,138671.875,-37.765863194486535,-0.012220402588473345,0.7339997654729684 +B1,140625.0,-38.783377363848906,0.0030094435856020674,0.43799499168534917 +B1,141601.5625,-38.3088227891913,-0.09294051838479245,0.8443133781068636 +B1,142578.125,-38.06806388570455,-0.03720375565263101,0.6755110177917301 +B1,144531.25,-38.7233678461524,0.0778083623219783,0.4354548043086144 +B1,145507.8125,-38.004189590343536,-0.047466280619371304,0.8796850625943815 +B1,146484.375,-37.90062268052044,-0.02512723059282651,0.748061819980377 +B1,148437.5,-38.543128599831846,0.020705450796858926,0.3883962055808834 +B1,149414.0625,-38.141710790728496,-0.05844036941576691,0.8221418957008548 +B1,150390.625,-37.860358828831004,-0.017218578680583185,0.6329732360620187 +B1,152343.75,-39.23619340867022,0.05736799187611519,0.264829928087513 +B1,153320.3125,-38.0204623890839,-0.06404370096901912,0.8388387620933836 +B1,154296.875,-37.72185981472068,-0.018591519204409934,0.7455954979083498 +B1,156250.0,-39.33239924449139,-0.06033527362369506,0.17644210709147082 +B1,157226.5625,-38.3339103328454,-0.08857159906344858,0.6658833088754323 +B1,158203.125,-38.079393807361214,-0.054301653331507715,0.5346078752544469 +B1,160156.25,-40.95046283982641,0.2048502846648219,0.163020659658336 +B1,161132.8125,-38.4132327904895,-0.0524779819890866,0.8338601482415012 +B1,162109.375,-38.03821440011593,-0.025758067501415294,0.7669695238011973 +B1,164062.5,-39.77497506683695,0.1296166389092508,0.2510985032420208 +B1,165039.0625,-38.19277603633339,-0.06419478837556225,0.8608957023475776 +B1,166015.625,-38.00271638386009,-0.040999546382074925,0.8179541614725476 +B1,167968.75,-39.48075289051674,0.18287645528242003,0.26409056636886435 +B1,168945.3125,-38.13293914822637,-0.042800174275499536,0.8615834425959561 +B1,169921.875,-37.81032990387509,-0.02888307522835465,0.817747969724381 +B1,170898.4375,-32.30637880386368,0.23521032811269071,0.2446966032914241 +B1,171875.0,-41.38941302339467,0.01948608469210633,0.15178793018317924 +B1,172851.5625,-38.46934712968342,-0.07102022135318276,0.854329635022435 +B1,173828.125,-38.1359339794042,-0.04947682200100756,0.8305670957894457 +B1,174804.6875,-33.76287980645828,0.1959339528029833,0.24452786837731647 +B1,175781.25,-39.09004331258728,0.28332179129949386,0.20598137079602855 +B1,176757.8125,-38.19351424872645,-0.04053085696008285,0.8530182330750476 +B1,177734.375,-37.965715036914574,-0.03525818361334876,0.8405317052371771 +B1,178710.9375,-34.327708327204405,0.1907306738047878,0.25663953708083725 +B1,179687.5,-39.43415762146525,0.18642888831650772,0.16645451129237893 +B1,180664.0625,-38.35734035446162,-0.05897572503413251,0.8357934162246735 +B1,181640.625,-38.24883907775552,-0.05548684992079167,0.8367069878675016 +B1,182617.1875,-36.36803043745045,0.20846033665211605,0.22000415745067028 +B1,183593.75,-39.03104405724048,0.06672107348223077,0.1713842183708287 +B1,184570.3125,-38.07666327674664,-0.06810447316544632,0.8394907548096019 +B1,185546.875,-37.938511265179315,-0.06475688175741023,0.8511080123295165 +B1,186523.4375,-35.823893284061654,0.09602990414516555,0.23357130105961935 +B1,187500.0,-41.26290874493223,0.06046536540473335,0.08628725691551895 +B1,188476.5625,-38.248139113379565,-0.07898851253831607,0.8376535436783086 +B1,189453.125,-38.10111243001732,-0.06644242812810841,0.843562500299022 +B1,190429.6875,-36.657514163229614,0.23530593147006718,0.24191491817278943 +B1,191406.25,-40.333407009205196,0.2677631174090709,0.09683105317776836 +B1,192382.8125,-38.16467520303649,-0.05484878529842785,0.8487787999289662 +B1,193359.375,-37.944153097005426,-0.060831337739110314,0.8643307136832383 +B1,194335.9375,-35.627752014614074,0.07461116745196117,0.34729450008042495 +B1,195312.5,-41.60260906573416,0.37444466218983496,0.05939793884802936 +B1,196289.0625,-38.136094817705974,-0.05449941851942208,0.831853921727032 +B1,197265.625,-37.91421489468232,-0.05981879531396528,0.8704787565267361 +B1,198242.1875,-35.80790052523892,0.07558916145202321,0.3665947879880222 +B1,199218.75,-42.32190460906702,0.7113321912111004,0.03824869154950594 +B1,200195.3125,-38.251021626218346,-0.03333121918864235,0.8140159629785763 +B1,201171.875,-38.00688376101979,-0.046016042102861476,0.8765979384272096 +B1,202148.4375,-36.305490633013086,0.12620456960887338,0.3769166777750297 +B1,203125.0,-41.439384824075624,0.6615957046125294,0.03624769885012422 +B1,204101.5625,-38.05316315167884,-0.04880064414249974,0.7935189904345039 +B1,205078.125,-37.867838981570245,-0.0642933257571765,0.8610995044561819 +B1,206054.6875,-36.45804866841205,0.10659704566532202,0.39365741395876386 +B1,208007.8125,-38.07581241683238,-0.0409051323491223,0.8177732876440554 +B1,208984.375,-37.96679560040549,-0.0602509879415023,0.8760702278787198 +B1,209960.9375,-36.57445295086437,0.10547963826421602,0.41649978232793916 +B1,211914.0625,-38.3217138428357,-0.07032240169087567,0.7817659214414314 +B1,212890.625,-38.050598197093294,-0.06975262270515126,0.8816518742878338 +B1,213867.1875,-36.8380887101108,0.06439343584301982,0.44075964336123996 +B1,215820.3125,-38.39116670381863,-0.006597938581119678,0.7578359654526218 +B1,216796.875,-38.13371552981005,-0.053821966025154655,0.887699293789578 +B1,217773.4375,-36.926793960457054,0.02168269130110989,0.49562620924456396 +B1,219726.5625,-38.43442144304071,-0.026446655654193574,0.7251546178988516 +B1,220703.125,-38.08000711312984,-0.05754651372839126,0.8695300390646917 +B1,221679.6875,-36.85088815606004,0.028212636377443534,0.4927720238052469 +B1,223632.8125,-38.61391300986248,-0.039016705283927866,0.6938596614967671 +B1,224609.375,-38.14869371647214,-0.046632195056369063,0.8777021455722124 +B1,225585.9375,-37.47262499036849,0.03384009409112343,0.5047062229129543 +B1,227539.0625,-38.601361399885114,-0.025595678829655633,0.6665814386186543 +B1,228515.625,-38.07368258693422,-0.050825658849152244,0.8561083509262682 +B1,229492.1875,-37.318252171204435,0.04956399817917845,0.526112091896044 +B1,231445.3125,-38.36795768247952,-0.017041443923774047,0.6674782958064576 +B1,232421.875,-38.17141035546764,-0.06097272475991655,0.8673983824559341 +B1,233398.4375,-37.34199088779248,0.04631479927971682,0.5467180675550036 +B1,235351.5625,-39.13747720421728,-0.01772962395886246,0.5828895199217486 +B1,236328.125,-38.394044412584535,-0.05667183943501097,0.8482833940087191 +B1,237304.6875,-37.96023275966449,0.01689765939612009,0.5153877853406972 +B1,239257.8125,-38.835874841635516,-0.051600621861060514,0.6031957193744377 +B1,240234.375,-38.282929628177634,-0.08518722414937763,0.8643776124355549 +B1,241210.9375,-37.71695424187416,-0.005815112918482246,0.5800631922916281 +B1,243164.0625,-38.950920211316344,0.00046551823508211854,0.5381030988489353 +B1,244140.625,-38.07934627554456,-0.057831311324851864,0.847701320275973 +B1,245117.1875,-37.570634892079376,0.021428783316733035,0.566222539741151 +B1,247070.3125,-38.29076782890006,-0.010517863502805369,0.5328453965456871 +B1,248046.875,-38.091029391763456,-0.07318005053841725,0.8291787564701654 +B1,249023.4375,-37.57795292449077,-0.002910256157542257,0.561043863849675 +B1,250976.5625,-38.375349502720184,-0.06342830448305392,0.517173402044221 +B1,251953.125,-38.03945854259771,-0.10293077145027096,0.8292540054802403 +B1,252929.6875,-37.447759184719274,-0.050633571204120376,0.5403247247474912 +B1,254882.8125,-38.7065872494096,-0.0001336183011040326,0.3729579827204753 +B1,255859.375,-38.21953805084838,-0.09297227610201286,0.7681502997830623 +B1,256835.9375,-37.51919259990792,-0.056895536256460044,0.5556250056983147 +B1,258789.0625,-39.063595679289875,-0.07057397681707611,0.36279360952275913 +B1,259765.625,-38.17496590746699,-0.09488761101019394,0.7805046600638662 +B1,260742.1875,-38.001357986518116,-0.03721177469930215,0.4871263340358792 +B1,262695.3125,-38.93684749699488,-0.10553159748487317,0.2635565974236309 +B1,263671.875,-38.230796499639574,-0.12171040740757544,0.7588202083455007 +B1,264648.4375,-37.928522102711355,-0.07051844005291708,0.5920111563224195 +B1,266601.5625,-38.13856557276266,0.012165571077491943,0.4069692731533475 +B1,267578.125,-38.116218383231,-0.06110916871194183,0.8005860720792665 +B1,268554.6875,-37.70784673587385,-0.017376243292346327,0.6126778192413342 +B1,270507.8125,-38.426360176727925,0.04400192558800642,0.3054574599942524 +B1,271484.375,-38.42192115301979,-0.07708730452941781,0.7689372776214657 +B1,272460.9375,-38.13557990689898,-0.0580700289479501,0.5840531002768564 +B1,274414.0625,-38.353816795887965,0.01309662935766287,0.29974661874252845 +B1,275390.625,-37.85439357235225,-0.0637810124390592,0.7902142629528107 +B1,276367.1875,-37.73315890680815,-0.042503420004531556,0.6236840345058129 +B1,278320.3125,-39.490336373843306,0.13951806880625384,0.19310003707277912 +B1,279296.875,-38.28450163092909,-0.06280296505369831,0.7383482806395046 +B1,280273.4375,-38.00398007898877,-0.03327702769581542,0.5976552484572744 +B1,282226.5625,-40.208371872053675,-0.19389690668966564,0.15732155807439707 +B1,283203.125,-38.38973040220334,-0.14280035763939436,0.7222952767533588 +B1,284179.6875,-38.190100577188105,-0.08269545522022703,0.5893741454832181 +B1,286132.8125,-41.24065141807692,0.3526056454212507,0.08587840871979904 +B1,287109.375,-38.476703892062424,-0.04459594878426998,0.6445922833973713 +B1,288085.9375,-38.29232343163696,-0.018454554697672876,0.5386511150318286 +B1,290039.0625,-38.84008507715144,0.05683780271167782,0.10962906362867948 +B1,291015.625,-38.131417807247274,-0.08090667171305466,0.6578468176193466 +B1,291992.1875,-37.90353295308211,-0.05601483691860043,0.5499479654539138 +B1,294921.875,-37.707526830516514,-0.027972278736891454,0.6267876161507835 +B1,295898.4375,-37.64343500860767,-0.02498426416275512,0.5153769013541835 +B1,298828.125,-37.60065555317984,-0.08092830282497543,0.5484155913901979 +B1,299804.6875,-37.46376839277828,-0.0643852983331068,0.49315171383913303 +B1,302734.375,-38.21842476925316,-0.10713115882715707,0.48321282160679674 +B1,303710.9375,-38.10422100343164,-0.09292273943557872,0.4090206778888739 +B1,306640.625,-38.22310360032474,-0.12511001629631258,0.42250563197921703 +B1,307617.1875,-37.993121675029734,-0.08680614415704824,0.3826261587849209 +B1,310546.875,-38.40284978546486,-0.05227988791296756,0.32592626697710897 +B1,311523.4375,-38.219360984271134,-0.044763619992923775,0.3423761129439032 +B1,314453.125,-37.51585279363853,-0.19640320400295463,0.32867026393699356 +B1,315429.6875,-37.3540856858297,-0.1666587613481183,0.3193809277561467 +B1,318359.375,-36.913007729897274,-0.02524389507180924,0.24015805048272187 +B1,319335.9375,-36.92296831000725,-0.019839865695338244,0.261042905684692 +B1,322265.625,-39.49199058157523,-0.282476404785704,0.11646766552075227 +B1,323242.1875,-38.69111761578886,-0.3038828441594479,0.16701869485928608 +A2,-12695.3125,-38.156966921166614,0.0524029538446813,0.5134937237562094 +A2,-11718.75,-37.85929976151155,0.0027305641417485482,0.7557728488291876 +A2,-10742.1875,-37.971364631282704,-0.0025184473874402258,0.8468321427705342 +A2,-9765.625,-38.13595276893775,-0.009611977375699077,0.8763163112085477 +A2,-8789.0625,-38.05164721327207,-0.014065270269077779,0.8909312141433202 +A2,-7812.5,-38.057971743459454,-0.019274086085822706,0.9043110233857405 +A2,-6835.9375,-38.02335399050537,-0.013391520486440989,0.9135730701597092 +A2,-5859.375,-38.0421030769945,-0.001989552939094974,0.9207186038613392 +A2,-4882.8125,-38.01019810943497,0.002685869870949542,0.918973748809197 +A2,-3906.25,-38.090298797518926,-0.0016640653429802477,0.9111893074473901 +A2,-2929.6875,-38.154710656832705,-0.011498616516639082,0.9069617597827632 +A2,-1953.125,-38.123172699804435,-0.014439479885376638,0.9021025732360011 +A2,-976.5625,-38.23374487791857,0.009201264956566924,0.8989458906921672 +A2,0.0,-38.039230344489674,-0.04007508054521347,0.8949115923188998 +A2,976.5625,-37.94275085325327,0.022180049228253562,0.9139530901761024 +A2,1953.125,-38.05205709081545,0.004935850435326294,0.9050739757099442 +A2,2929.6875,-38.26638002727664,-0.007272890957851441,0.9046239742492046 +A2,3906.25,-38.100076283661146,0.0072504586444570585,0.8998595179361535 +A2,4882.8125,-38.09965615979542,0.012857550032808529,0.8870642714826449 +A2,5859.375,-38.33854734098668,0.007503741948252429,0.8815462645652715 +A2,6835.9375,-38.28779067506091,0.006498099154212067,0.8948009731379402 +A2,7812.5,-38.1596380160689,0.02492573189189029,0.9031466140410886 +A2,8789.0625,-38.1061093743174,0.007174853068314668,0.9112026142134628 +A2,9765.625,-38.225672739538474,0.0017109325689572685,0.8908793733512852 +A2,10742.1875,-38.33036237154599,-0.004229973728766101,0.8503715991022176 +A2,11718.75,-38.49629876584818,-0.014083438432297868,0.7383654653837757 +A2,12695.3125,-38.334532987007364,-0.007943519833690349,0.43129189927983536 +B2,-323242.1875,-37.80353115816005,-0.01224858371724169,0.14515397401602534 +B2,-322265.625,-37.38355756064628,-0.007977188201757635,0.12721154735692988 +B2,-319335.9375,-39.38506207613408,-0.07938352626261036,0.15576543805335197 +B2,-318359.375,-39.392593541581846,-0.06386889849703836,0.14849434051384852 +B2,-315429.6875,-38.073850483655235,0.06099316271986188,0.20874422967978906 +B2,-314453.125,-37.575438110145,0.027636417303185556,0.21703677297761542 +B2,-311523.4375,-37.392645745949515,-0.011876837013080177,0.32048991020044815 +B2,-310546.875,-37.44578576250107,-0.0027343193272768573,0.3402913611463211 +B2,-307617.1875,-38.11157952980868,-0.026940801247004487,0.339866003578645 +B2,-306640.625,-37.46862009309225,-0.026479391446072142,0.3910283071824329 +B2,-303710.9375,-39.34352957506442,-0.012745278384499681,0.3245550271182573 +B2,-302734.375,-38.61969551842725,-0.006820912684465608,0.41393758844256734 +B2,-299804.6875,-38.03658440700558,0.019921976221913162,0.37808112675921357 +B2,-298828.125,-37.66569203884787,-0.0016814482800664443,0.477654961459326 +B2,-295898.4375,-38.10155254109029,-0.05094140749835585,0.43748674204070226 +B2,-294921.875,-37.94209651425981,-0.05511391197679627,0.548428516147571 +B2,-291992.1875,-38.411454839934486,0.02664548330090355,0.4564968719437415 +B2,-291015.625,-37.960309739930565,0.010129547513194392,0.6025848866503828 +B2,-290039.0625,-38.00302307935216,-0.10983859495851123,0.10555147197548997 +B2,-288085.9375,-39.09622235628114,0.011203487768318254,0.42135040944190916 +B2,-287109.375,-38.447642224952354,0.011961585164832922,0.6208034706887224 +B2,-286132.8125,-35.82500602649909,0.09051546311693093,0.22420982125476527 +B2,-284179.6875,-37.931893886344824,0.039590395251452026,0.5491095021112486 +B2,-283203.125,-37.44550938744991,0.039414518847798785,0.7030459498618051 +B2,-282226.5625,-35.38467894956514,0.11644119008016718,0.27837270254063834 +B2,-280273.4375,-38.56546623243189,0.010905906406458499,0.4692961485206775 +B2,-279296.875,-38.2842839329758,0.02690100059940992,0.6898813891283779 +B2,-278320.3125,-36.479565333761755,0.12121206049961142,0.2742802594330767 +B2,-276367.1875,-38.53307985667685,0.014153891497221238,0.5250393000116242 +B2,-275390.625,-38.301853899661765,-0.009039327738727287,0.7161254018777411 +B2,-274414.0625,-37.46201222815878,-0.0151573306713364,0.2856831592802131 +B2,-272460.9375,-38.67806581750522,-0.0015429008029252955,0.5068294866986848 +B2,-271484.375,-38.09055910798386,-0.005443083940853466,0.7440158832882935 +B2,-270507.8125,-37.30125350214001,-0.008651446472700552,0.33414499696490557 +B2,-268554.6875,-38.40607962847352,-0.0015067571240883204,0.519986552847977 +B2,-267578.125,-37.90804583807607,0.011640481259951763,0.7676501155023321 +B2,-266601.5625,-37.45992055550224,0.035915108921797056,0.37537923313419674 +B2,-264648.4375,-38.899855325115965,-0.009167264162837085,0.5104001143945888 +B2,-263671.875,-38.384622142922936,-0.020562618787302256,0.7880899663346677 +B2,-262695.3125,-37.272645913884354,-0.03002981917068226,0.443465821749902 +B2,-260742.1875,-38.95476364598937,-0.001422792490338498,0.4148143442880526 +B2,-259765.625,-38.11263433281414,-0.012617332332609976,0.6454517072019782 +B2,-258789.0625,-36.98539890569036,0.02878119516328903,0.2147489631360649 +B2,-256835.9375,-38.803074620447326,0.005982530975366718,0.23655321199124876 +B2,-255859.375,-38.095194220918934,-0.030712003531204513,0.679578453106966 +B2,-254882.8125,-37.84464662652537,-0.020206325805297798,0.4118298898327214 +B2,-252929.6875,-38.45353907457198,0.06126086584648904,0.4178800481058716 +B2,-251953.125,-37.994472812613594,0.004107821311763349,0.7622257036131241 +B2,-250976.5625,-37.1532711132057,-0.011184392266783583,0.440728954460204 +B2,-249023.4375,-38.66919699787807,0.011225262129335611,0.38681091074031343 +B2,-248046.875,-37.87230498466806,-0.009203197438389044,0.8051473297423799 +B2,-247070.3125,-37.2975475070901,0.0034878100425288494,0.5689464845608043 +B2,-245117.1875,-38.854099042682904,-0.002949357307250544,0.39303027465489965 +B2,-244140.625,-38.227900242234234,-0.019943408976407007,0.7984319094875281 +B2,-243164.0625,-37.63525256991554,0.000600814190419019,0.5665103351972087 +B2,-241210.9375,-39.081922668694546,0.02500583519931654,0.3868454787267075 +B2,-240234.375,-38.174496796160234,-0.0035023677792782593,0.8295675061255037 +B2,-239257.8125,-37.54197048372837,0.006476348479962812,0.6402424455039682 +B2,-237304.6875,-39.65078154676049,-0.0514456926764848,0.35132950788760675 +B2,-236328.125,-38.36780569316745,-0.01682011678458384,0.8131093520507672 +B2,-235351.5625,-37.47479719029825,0.0074673963582614356,0.6702040679147592 +B2,-233398.4375,-39.191331827555615,-0.01022331994721748,0.366430262296077 +B2,-232421.875,-38.25941625866946,-0.022869887331094407,0.8486809946886548 +B2,-231445.3125,-37.86357700394448,-0.00221075650747915,0.7089914441135786 +B2,-229492.1875,-39.200923714059705,-0.11536012858758715,0.3369331908113733 +B2,-228515.625,-38.42146055031745,-0.02319074685221789,0.8336988391715018 +B2,-227539.0625,-37.88899257349767,0.01599450728342644,0.6822813608271868 +B2,-225585.9375,-39.78629792843311,0.038172147808825496,0.2816102657906477 +B2,-224609.375,-38.30748246663374,-0.009163949458957266,0.8301967045468202 +B2,-223632.8125,-37.59049416649915,0.015843203120674332,0.7281342751031578 +B2,-221679.6875,-39.701781656056674,0.03813981547431,0.26113754978383774 +B2,-220703.125,-37.97960620653571,-0.010546548460844463,0.8321253079724864 +B2,-219726.5625,-37.590123157012705,0.0212838748968065,0.7382565221609005 +B2,-217773.4375,-40.68080150739505,-0.023561722804099183,0.19231175177087884 +B2,-216796.875,-38.427556274819025,-0.009942251133667757,0.79672214876266 +B2,-215820.3125,-38.098771536770684,-0.018136229042209795,0.678352931967719 +B2,-213867.1875,-40.11214118345177,0.03200911320438138,0.17355968228317192 +B2,-212890.625,-38.164243146969106,-0.004281253782408179,0.7772520029490548 +B2,-211914.0625,-37.773739093109725,-0.011495626784606472,0.6761243377361027 +B2,-209960.9375,-40.12293143571621,-0.04370157118097229,0.1189667317809446 +B2,-208984.375,-38.20494963536482,-0.011388779280328443,0.7237028147748679 +B2,-208007.8125,-37.89588152438091,0.0025838863308909055,0.6393880488236908 +B2,-206054.6875,-40.29289861897002,-0.18385520839657432,0.11181303450092743 +B2,-205078.125,-38.221596049459734,-0.018320832916519425,0.7367424105760382 +B2,-204101.5625,-37.911567618292096,0.004556266754259131,0.6692059552981146 +B2,-203125.0,-33.47393945404778,0.22300264744510034,0.10795688369710994 +B2,-202148.4375,-39.62013954678383,0.002030685994475867,0.12021458964408235 +B2,-201171.875,-38.182978767050486,-0.024842807933291855,0.7587155450146761 +B2,-200195.3125,-37.88654444298023,-0.015050596739970779,0.7474897605058135 +B2,-199218.75,-33.147790818872956,0.13670399526469135,0.17692749700429267 +B2,-198242.1875,-42.01560391350693,-0.03845782556337518,0.07378615684508792 +B2,-197265.625,-38.4039045515376,-0.037937534845965626,0.7917508591260124 +B2,-196289.0625,-38.10428269824312,-0.02694154948517813,0.7856063440223471 +B2,-195312.5,-34.195628781881545,0.09701761074639936,0.20185204640093107 +B2,-194335.9375,-43.75119577015619,0.27117420618034016,0.05098987357597195 +B2,-193359.375,-38.51714543976725,-0.003599240839179174,0.7813288099696141 +B2,-192382.8125,-38.15205082188545,-0.016702772368291097,0.7758326451852723 +B2,-191406.25,-34.834538115891476,-0.09247692823091347,0.22453215551913064 +B2,-190429.6875,-40.98959054701201,0.3128973218517057,0.08251872296444826 +B2,-189453.125,-37.93841557013553,-0.003339149866118607,0.8095451292905683 +B2,-188476.5625,-37.700350987477144,-0.019230592714877925,0.8274202211732142 +B2,-187500.0,-35.28281349122791,-0.06524295309817063,0.2239474314495968 +B2,-186523.4375,-43.6072575812203,-0.3766019092034163,0.034951751302823304 +B2,-185546.875,-38.44814239383963,-0.02455977636262796,0.7570593177944742 +B2,-184570.3125,-38.15662359601388,-0.014300262734842306,0.8024351958365632 +B2,-183593.75,-36.07700534849049,-0.022203747722354894,0.24508925381454985 +B2,-182617.1875,-43.20997962061682,0.14744853640287436,0.0365150301712836 +B2,-181640.625,-38.26621798449758,-0.013541495390809732,0.7747618938679331 +B2,-180664.0625,-37.99731344331652,-0.017184480042602868,0.8082575929101142 +B2,-179687.5,-35.65397453772877,-0.005555411648583863,0.2661465514149641 +B2,-178710.9375,-51.46014617977649,0.24348918713392242,0.0040140961688948365 +B2,-177734.375,-38.51644922378881,-0.046744011177676015,0.7497889180658937 +B2,-176757.8125,-38.16031404403135,-0.047362737562770985,0.8383328315730929 +B2,-175781.25,-36.850887318427056,0.008608708432352952,0.3017437674939374 +B2,-174804.6875,-49.845232663486115,-0.06731215076965258,0.006176284517982907 +B2,-173828.125,-38.52845712462103,-0.008745830797375564,0.7660971404501923 +B2,-172851.5625,-38.10578705907095,-0.0036369111938285847,0.8205135250207256 +B2,-171875.0,-35.136191721141714,0.06647994598835938,0.3357805816772352 +B2,-170898.4375,-54.343692219403565,2.5964274524949778,0.0012214273997872924 +B2,-169921.875,-38.510326204091946,-0.04537342444742709,0.7260759120956516 +B2,-168945.3125,-38.109624952970684,-0.04288341942654306,0.8537291992845338 +B2,-167968.75,-36.59180511527873,0.08716825779725967,0.35648493484422944 +B2,-166015.625,-38.654366145824035,-0.03529253173958402,0.7294268335159237 +B2,-165039.0625,-38.31117892072432,-0.020172306559193665,0.8385973639402192 +B2,-164062.5,-37.22356145408924,0.06328748817015528,0.32826041934218014 +B2,-162109.375,-38.61243488038476,0.005063185342111254,0.6767650163722378 +B2,-161132.8125,-38.08214824515668,0.0005875788683735728,0.8205103884335636 +B2,-160156.25,-36.08150785146102,0.03848888795749339,0.3926552830052948 +B2,-158203.125,-38.65204129097895,0.018706013828528434,0.6938584109808685 +B2,-157226.5625,-38.14938812448344,-0.0019868321623337515,0.8305489764192764 +B2,-156250.0,-36.56473728851616,-0.010780188450269623,0.3252405547470241 +B2,-154296.875,-38.58899381336264,-0.010841731266885812,0.3665893802921037 +B2,-153320.3125,-38.181821051189985,-0.015620046946823951,0.5830026987374088 +B2,-152343.75,-37.14832739357792,0.05443021249611624,0.22794169091894703 +B2,-150390.625,-38.41660716929895,0.006584781362164005,0.534695505309421 +B2,-149414.0625,-38.056139740116265,-0.0193998445000938,0.7522033990430608 +B2,-148437.5,-36.97119584782028,-0.014663276209673448,0.31782815763332534 +B2,-146484.375,-38.412036175962335,-0.026420952693531063,0.45124660333118644 +B2,-145507.8125,-38.02015105788334,0.0008414105068879074,0.7585900838829202 +B2,-144531.25,-36.84456265305228,0.09952492706258731,0.4492889784034066 +B2,-142578.125,-38.53639873947675,-0.022415721660885346,0.5924129821422206 +B2,-141601.5625,-37.95916205407228,-0.03706198755171819,0.8279407161286331 +B2,-140625.0,-36.88833555407087,-0.009585503452065769,0.48156394606971564 +B2,-138671.875,-38.62710481782876,-0.039258001676734544,0.46084891379039333 +B2,-137695.3125,-38.281215888224295,-0.0312931574225237,0.7439804615819228 +B2,-136718.75,-37.44811518650211,-0.05685567360122468,0.44641718065546593 +B2,-134765.625,-38.48445702798831,-0.05083299908723582,0.5114467905927901 +B2,-133789.0625,-38.175312295845465,-0.057232141744610665,0.7834041057780067 +B2,-132812.5,-37.506561791096516,-0.025707268549279405,0.4739374770527342 +B2,-130859.375,-38.9669339079241,-0.026493024538042587,0.35802651657725176 +B2,-129882.8125,-38.383101222769014,-0.03500236793614153,0.6848948084394487 +B2,-128906.25,-37.654220882957,-0.005605651607381912,0.37875996317895033 +B2,-126953.125,-38.826090451483495,-0.06747049929761095,0.4269816176293685 +B2,-125976.5625,-38.344478353275505,-0.03620891866167675,0.7704113660931392 +B2,-125000.0,-37.400765592019006,-0.004743673719354025,0.4938104261994462 +B2,-123046.875,-39.26314617166968,-0.010438405745800683,0.2772006891781261 +B2,-122070.3125,-38.17990497852491,-0.02378508868919127,0.6444474258409886 +B2,-121093.75,-37.57049050227876,-0.005445738755358143,0.39160168338037465 +B2,-119140.625,-38.603242776927374,-0.07197454219920552,0.35446321178493595 +B2,-118164.0625,-38.152900913482036,-0.013245424685940588,0.77964287752964 +B2,-117187.5,-37.348660459774,-0.024305498135913428,0.5075054444491724 +B2,-115234.375,-38.73180611021061,-0.04185990694113517,0.2278630673757102 +B2,-114257.8125,-38.10509688829025,-0.030861864852775867,0.6066012828998417 +B2,-113281.25,-37.37003944600759,-0.035294923786044485,0.3700179706271448 +B2,-111328.125,-38.85595557276976,-0.021493799383534018,0.28362501207108964 +B2,-110351.5625,-38.14362345807345,-0.03532224044440113,0.7596352953622716 +B2,-109375.0,-37.52914695451774,-0.03003896427351549,0.5903068520600299 +B2,-107421.875,-39.69516897175791,0.0008288350992780025,0.17936538623360374 +B2,-106445.3125,-38.30765340737519,-0.01864664306205377,0.5586112020473276 +B2,-105468.75,-37.95694844487378,-0.0029089985504242577,0.31733595814657223 +B2,-103515.625,-38.83440788668729,0.029903444999839213,0.2405428536682937 +B2,-102539.0625,-38.03906377637271,-0.05478163724315799,0.727841153082673 +B2,-101562.5,-37.62594963307014,-0.04623371893063899,0.5451225552228146 +B2,-99609.375,-40.35468089911224,0.03079080230575526,0.13463361997012668 +B2,-98632.8125,-38.30955379103664,-0.020354446789859093,0.523636656600468 +B2,-97656.25,-37.76293168782085,-0.01907131122090089,0.35647081883872134 +B2,-95703.125,-40.63387166026958,0.007353777940101391,0.13138440246421995 +B2,-94726.5625,-38.19087097910027,-0.02191733941984797,0.7129828056889149 +B2,-93750.0,-37.77387771621565,0.0013691864343159388,0.5801265570579909 +B2,-91796.875,-41.36264105761676,-0.15000608517791436,0.09924571143529641 +B2,-90820.3125,-38.7240779678493,-0.036491142929397036,0.6438153017082375 +B2,-89843.75,-38.291150001365324,-0.014647613314578756,0.5182314125685067 +B2,-87890.625,-39.612979253749344,-0.026737568338142115,0.1455213365951786 +B2,-86914.0625,-38.299809829287774,-0.07317903619867128,0.7428964764205792 +B2,-85937.5,-37.86055084062688,-0.04740878151577865,0.652005250007652 +B2,-83984.375,-38.26785238469095,-0.18154381204388592,0.15878648310747334 +B2,-83007.8125,-38.08150658815981,-0.08780264939937377,0.6993300713888125 +B2,-82031.25,-37.838763386495124,-0.08164558423992974,0.6257477567100102 +B2,-80078.125,-39.85481581158929,-0.021127652032550515,0.10739369057881731 +B2,-79101.5625,-38.18709167880213,-0.09601776919921345,0.710083735729292 +B2,-78125.0,-37.84963653164608,-0.09495963640968119,0.6304698789279994 +B2,-77148.4375,-32.92354317302657,0.01627385034672546,0.10527826003636533 +B2,-76171.875,-40.599308304529636,-0.26936971960889866,0.07358702208655957 +B2,-75195.3125,-38.35301993905204,-0.08532800849963129,0.6736979943902774 +B2,-74218.75,-37.96999027428592,-0.06188163898088783,0.6304765531270548 +B2,-73242.1875,-32.438914208948326,0.17349573271367014,0.13166505165282322 +B2,-72265.625,-42.40091467985718,-0.3618372560741532,0.038150393046090546 +B2,-71289.0625,-38.10816611554386,-0.10375495235439747,0.6660409669802179 +B2,-70312.5,-37.729087506152496,-0.08110126502387027,0.6407177002291442 +B2,-69335.9375,-33.28807837037851,0.13721844169307662,0.12626939143760418 +B2,-68359.375,-40.27534087505947,-0.26544908223170416,0.04954907957066392 +B2,-67382.8125,-38.169240929778695,-0.08839128675645114,0.6137502320348567 +B2,-66406.25,-37.91669800136988,-0.09255152760674878,0.5949528434720929 +B2,-65429.6875,-34.10126438133852,-0.2506406339194489,0.10680417200073396 +B2,-64453.125,-45.975769451375434,0.6751921849339806,0.011009298987811765 +B2,-63476.5625,-38.305698983867956,-0.09669042313296305,0.6387869047077745 +B2,-62500.0,-37.78648195495589,-0.11683876805681681,0.6466897550535122 +B2,-61523.4375,-33.589661711537595,-0.2201313370300051,0.1669128422831331 +B2,-60546.875,-43.199937250693814,0.501305719161159,0.017337701704411776 +B2,-59570.3125,-38.10560229520195,-0.12878724177480638,0.6073103259517258 +B2,-58593.75,-37.817385987285235,-0.13962964288092605,0.6168268528821907 +B2,-57617.1875,-35.272449281926214,-0.13136498175035305,0.10339500876747086 +B2,-56640.625,-44.87209695716,0.23335228918086326,0.0074771198191389745 +B2,-55664.0625,-38.21139965993352,-0.23439610675177813,0.5730014495708579 +B2,-54687.5,-37.80704670971008,-0.2480362508660363,0.6724174273594737 +B2,-53710.9375,-34.57191788056744,-0.27508586119580314,0.18220760340091108 +B2,-52734.375,-40.34338624546449,-2.2760592622066205,0.025234606145781994 +B2,-51757.8125,-40.94859104459842,-1.0017021493475695,0.4260922566585255 +B2,-50781.25,-40.72432958261512,-0.9624599391674575,0.4822956903480507 +B2,-49804.6875,-41.27719465765672,-0.9675644426848549,0.06756728336306331 +B2,-48828.125,-39.777359863075894,-0.25574310447508464,0.0191950886980978 +B2,-47851.5625,-38.9602098081011,0.4217632013648207,0.506418930079926 +B2,-46875.0,-38.72765324427427,0.44754473918906656,0.5957420192590224 +B2,-45898.4375,-36.32811679871056,0.48964179644959716,0.1498931286140963 +B2,-44921.875,-55.86651897329056,0.3723926022425261,0.00042786385094965726 +B2,-43945.3125,-38.604169548446436,0.2118350486083056,0.5010160672944389 +B2,-42968.75,-38.16664075204973,0.20884681760630297,0.6070644298313874 +B2,-41992.1875,-35.47917168430082,0.24472205855142715,0.1742439932267232 +B2,-40039.0625,-38.11712439541138,0.07553837598192548,0.48097484250056255 +B2,-39062.5,-37.97037692263743,0.092093853857246,0.6020582696407698 +B2,-38085.9375,-36.09746410836959,0.04476492443589519,0.15069033038934848 +B2,-36132.8125,-38.66327320425844,0.060005848482929114,0.47121132691967216 +B2,-35156.25,-38.33668761113861,0.05196273281601904,0.6325759353088946 +B2,-34179.6875,-36.2758839078199,0.07905863449889461,0.21004720135304622 +B2,-32226.5625,-38.414133318244865,0.032663736528580234,0.5273092626479913 +B2,-31250.0,-37.93901364755821,0.03427229940936849,0.7392950150539621 +B2,-30273.4375,-36.85501945299899,0.04025488224378382,0.2886738970732941 +B2,-28320.3125,-38.46555452371645,0.02396633253488023,0.4812415748186627 +B2,-27343.75,-37.975938691215866,0.02621068611805999,0.7055601091249033 +B2,-26367.1875,-37.36004584228596,-0.020702566256772137,0.2558830025455566 +B2,-24414.0625,-39.27451093481888,0.020081793343052823,0.45861721806656386 +B2,-23437.5,-38.44393155091128,0.027443374983771918,0.7222209838666738 +B2,-22460.9375,-37.3950072461395,0.09395699312082417,0.3174549788365644 +B2,-20507.8125,-38.62695574887428,0.028327089477155898,0.5119428961483151 +B2,-19531.25,-37.98575166082553,0.046070148706212954,0.7605680528530112 +B2,-18554.6875,-37.15665020493098,0.05729578748803199,0.3560700612116969 +B2,-16601.5625,-38.83334757351907,-0.017953097967064124,0.4531446017281802 +B2,-15625.0,-38.333861136597086,-0.009138741260628969,0.7605821587006416 +B2,-14648.4375,-37.04598553587073,0.020970718667748134,0.4423119364332644 +B2,-12695.3125,-38.767690332643035,0.02211223201345014,0.4804173011328512 +B2,-11718.75,-38.377499778842974,0.006192903353557266,0.7596516762581429 +B2,-10742.1875,-37.628234345571315,0.027209650082859138,0.36655219336667755 +B2,-8789.0625,-38.52035807358374,0.05019170978781995,0.44286454856087987 +B2,-7812.5,-38.12794308631099,0.02911424243109373,0.7661600619995065 +B2,-6835.9375,-37.43978086072312,0.03611326016672711,0.4486930096370346 +B2,-4882.8125,-39.50663378357988,0.003882559185996559,0.4125218478949064 +B2,-3906.25,-38.372842191618005,-0.02075153788472317,0.7381088383729363 +B2,-2929.6875,-37.98704516583969,0.0038937121430620003,0.3165948168652633 +B2,2929.6875,-38.30263648156916,0.028857400158595503,0.3825758964351791 +B2,3906.25,-37.940766919055456,-0.02776056662298121,0.7347109085838397 +B2,4882.8125,-37.28101900911414,-0.02624621038167696,0.3607531257990989 +B2,6835.9375,-39.19646316162093,0.010688247130604456,0.21772763368929035 +B2,7812.5,-38.41282670822999,0.024032761948879156,0.7059107972418046 +B2,8789.0625,-37.758720926343635,0.050700808505475425,0.5064424978140281 +B2,10742.1875,-39.863138946960134,-0.015178045189722322,0.268483422997864 +B2,11718.75,-38.40596694866953,-0.026051124743674325,0.7126568563320638 +B2,12695.3125,-37.91539223638961,-0.013130482718635594,0.40192296304823494 +B2,14648.4375,-39.008522158685615,0.107209363038542,0.2129352159690431 +B2,15625.0,-37.89247766654823,0.04192315785746992,0.7326929355274151 +B2,16601.5625,-37.21614803696014,0.0445072138729512,0.5735387840766489 +B2,18554.6875,-38.42831220667236,-0.0034617701448507177,0.3024069987771255 +B2,19531.25,-37.865109698185236,0.013696440006791377,0.7531707365933802 +B2,20507.8125,-37.293153052211366,0.016225649569590495,0.5358550915429007 +B2,22460.9375,-39.6884228105705,0.03751684572601022,0.1626795797027851 +B2,23437.5,-38.033271908799755,0.013254408299855136,0.7611756694684032 +B2,24414.0625,-37.50765079417148,0.018116033225131556,0.6298565540338531 +B2,26367.1875,-40.09840668950317,-0.05650507876415212,0.23335205440680507 +B2,27343.75,-38.31505017895183,-0.026968677625536674,0.7952194550705571 +B2,28320.3125,-37.90874560281453,-0.012834706635111548,0.6070459294380345 +B2,30273.4375,-40.93557155518351,0.05390191478205253,0.10912194745842987 +B2,31250.0,-38.60348336888066,0.0285221237090445,0.6986128064712634 +B2,32226.5625,-38.13776373904231,0.04102794764510964,0.6327273152979307 +B2,34179.6875,-39.16907639043784,-0.0313378903304673,0.15067291581853265 +B2,35156.25,-38.0977110494151,-0.022518993615021188,0.6955916217355035 +B2,36132.8125,-37.771974949171046,-0.007547786958460367,0.5988816037994292 +B2,38085.9375,-39.788158935498366,-0.06723336622162535,0.11916625957594974 +B2,39062.5,-38.09340594155857,-0.016809687790661165,0.7285627073332334 +B2,40039.0625,-37.754810736653184,-0.009428825049511591,0.7048813081756097 +B2,41992.1875,-41.20330845680782,0.0059379584780456796,0.13112469945634697 +B2,42968.75,-38.48397483939446,-0.030783394840350198,0.7835385668719747 +B2,43945.3125,-38.13700150779706,-0.020141212152427812,0.7156729925461834 +B2,44921.875,-33.88065556467921,0.17960198018994822,0.11622805485004453 +B2,45898.4375,-39.40072030402126,-0.01620537370407371,0.13276764709916603 +B2,46875.0,-38.32148724935657,0.0017431317905898247,0.7014594489797839 +B2,47851.5625,-38.04344684673972,0.0027734802076966325,0.6709631741447972 +B2,48828.125,-33.38334698026372,-0.021653560927203053,0.12768505432521252 +B2,49804.6875,-41.01807172491152,0.22001802606216936,0.0737900987056116 +B2,50781.25,-38.52711060400023,0.007084537804854296,0.7111929183291341 +B2,51757.8125,-38.10444254060749,0.001712108023829817,0.626657585908615 +B2,52734.375,-32.519717133015945,0.03687533878423377,0.09169630085459701 +B2,53710.9375,-43.70741183745852,0.052420892396707774,0.014293080238171425 +B2,54687.5,-38.542956433792206,0.0005597011353142278,0.5102289722308687 +B2,55664.0625,-38.07245434103072,0.00659197250242638,0.6173624811794804 +B2,56640.625,-33.02653106650898,0.077802221137929,0.21272871760456943 +B2,57617.1875,-42.72893470234621,0.06262762829221069,0.054770728945185754 +B2,58593.75,-38.285394374821294,-0.008691573130900743,0.7798946153459709 +B2,59570.3125,-37.9003083186102,-0.002237974081477301,0.8205719206040909 +B2,60546.875,-33.633748073784496,0.10791260819077575,0.295135310064996 +B2,61523.4375,-45.30183310670335,0.0678704087176345,0.026174149783387436 +B2,62500.0,-38.52481342873547,0.0062980314432650175,0.7754423289888256 +B2,63476.5625,-38.15797307561768,0.015768026970726545,0.8058543767671088 +B2,64453.125,-34.75950777633297,0.19129876961535652,0.2819444337326489 +B2,65429.6875,-43.49995212912602,0.0017476746899172113,0.03572388567714626 +B2,66406.25,-38.38853942849491,-0.0021187633784598425,0.7820966708934759 +B2,67382.8125,-38.160608928578235,0.001022507119067484,0.8231382963399546 +B2,68359.375,-36.27002799304323,0.06419033210956293,0.24424934009992771 +B2,69335.9375,-42.17422358015863,0.18115478501979743,0.04089790085551686 +B2,70312.5,-38.19120424050152,0.0033724427476440333,0.791064303023848 +B2,71289.0625,-37.94030859577549,-0.003340569459365561,0.8293156532055144 +B2,72265.625,-35.6917692004733,0.01981217179630601,0.3224565711324529 +B2,73242.1875,-47.91350450964199,0.8190134265098816,0.010259894231606309 +B2,74218.75,-38.31333709302737,0.009609783163863295,0.796086556808895 +B2,75195.3125,-37.906205672203455,-0.0027060288764308993,0.8450819888795857 +B2,76171.875,-35.60455987152218,-0.023453732762894308,0.33668442351737204 +B2,77148.4375,-49.1036247434488,0.22828042438965168,0.005407841576198615 +B2,78125.0,-38.30917376146949,-0.00018548442859733782,0.7419019721594254 +B2,79101.5625,-38.01168120208792,0.004400224979838274,0.8480917216295103 +B2,80078.125,-36.277601353866075,0.11503681201475446,0.35393121332681293 +B2,82031.25,-38.609802339325626,0.011977719619993277,0.7345689639143113 +B2,83007.8125,-38.24513991962499,0.010356627417816178,0.844903284581344 +B2,83984.375,-36.50382486766675,0.0052695902570918385,0.3740928917069622 +B2,85937.5,-38.69460987115542,-0.0021636132261164676,0.7131756868695188 +B2,86914.0625,-38.159520507847716,-0.008620386592123275,0.8437468552028716 +B2,87890.625,-36.47258673429214,0.0654115735798162,0.44262230723220725 +B2,89843.75,-38.52889941022829,0.01143545067960483,0.7067965820777364 +B2,90820.3125,-38.02461822647999,0.01256680065025062,0.845034672397027 +B2,91796.875,-36.25290242818634,0.0424098956374408,0.437324582392226 +B2,93750.0,-38.42942114365837,-0.018518487182655363,0.6409169696263233 +B2,94726.5625,-38.04892110837419,-0.00918697932299839,0.8109213300563225 +B2,95703.125,-36.397526878590575,0.08922785963923996,0.44450438170311135 +B2,97656.25,-38.65029409750035,-0.006132048976649429,0.6653754332404059 +B2,98632.8125,-38.18296369480792,-0.008292281349759012,0.8532588476526145 +B2,99609.375,-37.45191987046628,0.11233184958100706,0.45375679279498815 +B2,101562.5,-38.78991143995773,-0.04694866640535045,0.6394536804107962 +B2,102539.0625,-38.334089091853954,-0.03919248867011005,0.8570356158716693 +B2,103515.625,-37.26641814386252,0.04036742253626535,0.5314894472373968 +B2,105468.75,-38.52604234152071,-0.013653957050884458,0.6782999984090914 +B2,106445.3125,-38.22528527580536,-0.027479589789052294,0.8709924246611939 +B2,107421.875,-36.83524289638338,-0.0012583623220354667,0.5575592629339535 +B2,109375.0,-38.646340767129345,0.05385830263880598,0.6125533396262871 +B2,110351.5625,-38.15182357152386,0.024171022904373896,0.8413257873215536 +B2,111328.125,-37.432424946911674,0.08025322504762133,0.5440955712573666 +B2,113281.25,-38.831706573178415,0.020981680722587548,0.5911801281251623 +B2,114257.8125,-38.310945971172295,0.01897056170560152,0.8529534578200499 +B2,115234.375,-37.6311036190564,-0.003245548516719765,0.5430452141911418 +B2,117187.5,-39.051385687394706,-0.006522841481359176,0.5013714318238307 +B2,118164.0625,-38.1946814441983,-0.00714969546324884,0.8392459877588262 +B2,119140.625,-37.700420798135276,-0.028440125037794584,0.5472522323487815 +B2,121093.75,-38.8703335910584,0.0021027453233517512,0.5381138813809886 +B2,122070.3125,-38.188753846257626,-0.029048879384044213,0.8543946687463954 +B2,123046.875,-37.506049497545185,-0.015877721341401863,0.5853465521228558 +B2,125000.0,-38.97757455304347,-0.000665412917371544,0.4460372840779208 +B2,125976.5625,-38.05074124668954,-0.026336363026473464,0.809407528111544 +B2,126953.125,-37.32761246089591,-0.035282600182172,0.5620194222492855 +B2,128906.25,-39.53303962931586,0.08232684724900796,0.34641050662754924 +B2,129882.8125,-38.59113994536232,0.006500590600900136,0.7758897744008436 +B2,130859.375,-38.117460298121614,0.013320247917387729,0.556160318554933 +B2,132812.5,-38.77174175772266,-0.028447216259442243,0.45260723927839885 +B2,133789.0625,-38.04199214355182,-0.0339124749106543,0.8487421516267969 +B2,134765.625,-37.68062587466,-0.00060102029813347,0.659480069362415 +B2,136718.75,-39.19738683082514,-0.0629018082130055,0.4369979428101833 +B2,137695.3125,-38.35806121206876,-0.028450032049841756,0.8621930843553576 +B2,138671.875,-38.0871178586361,-0.026429730604883517,0.7041640835185561 +B2,140625.0,-39.426783461851564,-0.04554035467324047,0.42681233957372117 +B2,141601.5625,-38.36882626910225,-0.007780391436105205,0.835627482401427 +B2,142578.125,-37.93205105259179,0.03530767364941001,0.6621642219856615 +B2,144531.25,-39.54311857625503,0.015005791403055024,0.39314070095429127 +B2,145507.8125,-38.179326257819156,-0.019230621086062882,0.8792841618128898 +B2,146484.375,-37.45756564232798,-0.0048718811410291,0.7561507865986251 +B2,148437.5,-39.10429669641467,-0.07184456423975627,0.3288838797094355 +B2,149414.0625,-38.23910269712701,-0.0405393472718516,0.7847140879354182 +B2,150390.625,-37.95482039032577,-0.011354968174708713,0.5970253483714891 +B2,152343.75,-39.54381423820769,0.1326288555314039,0.2386605299588314 +B2,153320.3125,-38.40532514679545,-0.0024088795779366734,0.8214911982020102 +B2,154296.875,-37.917689326452894,0.004389310191694307,0.7469579678180758 +B2,156250.0,-41.21253545339392,-0.05297967545903992,0.11811642125224892 +B2,157226.5625,-38.27208837662249,-0.015158743794373652,0.6659767675783549 +B2,158203.125,-37.7924079174415,-0.0007391160006497977,0.5369751190946246 +B2,160156.25,-40.51051533259213,0.03501597491276209,0.17961813467382903 +B2,161132.8125,-38.16635125809471,-0.013516394887368222,0.8618849496760153 +B2,162109.375,-37.746925280284174,-0.00022221413697876002,0.8099472185851205 +B2,164062.5,-39.799669958674706,0.06952413201503083,0.25560444286341166 +B2,165039.0625,-38.21999113025338,-0.00674381609888286,0.8590199991119014 +B2,166015.625,-37.88348717150619,0.002008021204173094,0.807511146164738 +B2,167968.75,-41.210135903397536,0.15158788358574116,0.18979792841270743 +B2,168945.3125,-38.533264978299535,-0.009686083651942123,0.8563844914762818 +B2,169921.875,-38.09736993800888,-0.011615969018145655,0.8115460509976816 +B2,170898.4375,-31.900787590917975,0.05014316364545879,0.2614758339194493 +B2,171875.0,-42.87442110905316,-0.02549301987055186,0.10869818861476356 +B2,172851.5625,-38.35046228434954,-0.022486357903061194,0.8422816933127683 +B2,173828.125,-37.939997395637135,-0.011417457675749532,0.8219261563101156 +B2,174804.6875,-33.25998279374237,0.12099536854334847,0.24538808933810471 +B2,175781.25,-41.01827903264281,0.01530208309165193,0.1396396960316083 +B2,176757.8125,-38.42665803558324,-0.018937423253024388,0.8247850176866984 +B2,177734.375,-38.05013620749421,-0.006135871071864418,0.8058929354512575 +B2,178710.9375,-33.11694518793582,0.1918746243796825,0.2848526335885061 +B2,179687.5,-41.87586963587965,-0.15513120617720322,0.09633742984977288 +B2,180664.0625,-38.420917806973065,0.005770637912667187,0.8255263144681255 +B2,181640.625,-38.18059318820238,0.010400328642346413,0.817085470856859 +B2,182617.1875,-35.62228376349347,0.02817163654986743,0.21870276041763487 +B2,183593.75,-41.862985381097,-0.1859455123631646,0.08002003461475252 +B2,184570.3125,-38.54717843509268,-0.026096451961805656,0.8191273245181429 +B2,185546.875,-38.22739316506494,-0.015932063945713004,0.8347789219922483 +B2,186523.4375,-34.74649232641073,0.059939884594808035,0.2996137068222296 +B2,187500.0,-43.735732726943326,-0.16242897986875615,0.04511991020636699 +B2,188476.5625,-38.54696174041224,0.00096019547221049,0.7937537416634892 +B2,189453.125,-38.2462682788429,0.01250424468191813,0.8160329196076973 +B2,190429.6875,-35.59923095149549,0.12010939739458815,0.2819401623830936 +B2,191406.25,-43.912877867886415,-0.3719111024993025,0.03611297158974138 +B2,192382.8125,-38.37390276986465,-0.0013753360868213882,0.7955232527166459 +B2,193359.375,-37.971596629787456,0.012345021986333915,0.8505136537559626 +B2,194335.9375,-34.31452523409865,0.08397506526103093,0.40894175988381654 +B2,195312.5,-45.545251885315864,0.04163388759247333,0.022761925882636744 +B2,196289.0625,-38.434251938195025,-0.011543495063552456,0.8101404917588984 +B2,197265.625,-38.10402760607189,-0.019282154658414985,0.8547405918042252 +B2,198242.1875,-35.20953041889075,-0.06607276257474304,0.37638518699147644 +B2,199218.75,-46.85217835273871,0.3614299241784429,0.011309791063225098 +B2,200195.3125,-38.62067431145896,-0.006970298793104401,0.7673402916884025 +B2,201171.875,-38.334140691739854,-0.011627537297034696,0.8454508224779829 +B2,202148.4375,-36.242246075190806,-0.030731273881941412,0.3686323179235086 +B2,203125.0,-46.92308874735801,0.11905684267344752,0.011012761368649513 +B2,204101.5625,-38.23224931221594,-0.013492140443968736,0.7820712687082961 +B2,205078.125,-37.95189489337745,-0.013011142564602896,0.8638772361126286 +B2,206054.6875,-36.23641451652878,0.02033174810401439,0.40826196709187734 +B2,208007.8125,-38.27540340488542,-0.0074421964538768925,0.7768447625575811 +B2,208984.375,-38.010456794110624,-0.01668515348140076,0.8634102811815516 +B2,209960.9375,-36.478967307404005,-0.0019319882480988149,0.43636583267435897 +B2,211914.0625,-38.952815492085904,-0.03680636963406192,0.7407434190291775 +B2,212890.625,-38.493875286643366,-0.011406069021722587,0.8636834738614588 +B2,213867.1875,-36.434248080936236,0.03537473001225555,0.4860234881894933 +B2,215820.3125,-38.49304436767126,-0.003148925345385134,0.7568615206177379 +B2,216796.875,-38.203122085324075,-0.016826345680819532,0.8775291015777085 +B2,217773.4375,-36.381160977038554,0.04088605414535351,0.5063368704000438 +B2,219726.5625,-38.822485700698294,-0.0008822295980999151,0.7125050306034165 +B2,220703.125,-38.39444531343461,-0.010264042601527912,0.8604802567943115 +B2,221679.6875,-37.16009285624686,-0.004021362840366471,0.48591986132048937 +B2,223632.8125,-39.23701397644526,0.02970262469586693,0.6438311312647549 +B2,224609.375,-38.523761955257456,0.0059677557499178135,0.8552826562122408 +B2,225585.9375,-37.38263358163274,-0.010308664027537162,0.48543037116645077 +B2,227539.0625,-38.81893100035445,0.026996921547087993,0.6485111020288483 +B2,228515.625,-38.25447092512388,-0.004649124759598777,0.8471990183824454 +B2,229492.1875,-37.18038433127476,0.012247193246484933,0.5076480535737706 +B2,231445.3125,-38.544448472188904,-0.028651211565078327,0.6755007896124277 +B2,232421.875,-38.12264563823828,-0.023662411355028112,0.8522681591913092 +B2,233398.4375,-37.13293325522278,-0.001935026012415797,0.5402403835460039 +B2,235351.5625,-39.09002654824517,-0.02202144499873082,0.5752943435310619 +B2,236328.125,-38.292716271002675,-0.01245356973674916,0.8418553589534705 +B2,237304.6875,-37.32877822373479,-0.018923782550278823,0.522559421753625 +B2,239257.8125,-39.204339336740965,0.015780227856188933,0.5566054378994308 +B2,240234.375,-38.45208449323978,0.028521648194223204,0.8558971097809549 +B2,241210.9375,-37.65991386330753,0.026331025736536784,0.5788736446677015 +B2,243164.0625,-38.88414993535014,0.0561894291016265,0.5321526879446368 +B2,244140.625,-38.20840599659678,0.006570311312083188,0.8287969937712383 +B2,245117.1875,-37.472607506437406,0.012206834612557227,0.5408017949136569 +B2,247070.3125,-38.64216414435644,-0.015136084878858647,0.5453445382895884 +B2,248046.875,-38.26135166677013,-0.003384359387224478,0.8599482414974668 +B2,249023.4375,-37.6981215594155,-0.0012781333049236565,0.6089935244539568 +B2,250976.5625,-39.35668599333679,-0.02441621716617437,0.4489423542023479 +B2,251953.125,-38.38377454125384,-0.013613382024715293,0.8236372324982578 +B2,252929.6875,-37.663852002254394,0.04557981152266022,0.5365960951168449 +B2,254882.8125,-37.653392950951286,0.004783899550518278,0.42841950597177914 +B2,255859.375,-37.90088041223541,0.0022079944677870778,0.7986485529563949 +B2,256835.9375,-37.41230511336143,0.027375996853348905,0.5776585476035738 +B2,258789.0625,-38.84074035394178,0.03516594381050986,0.3904568177413119 +B2,259765.625,-38.063054236042845,0.03023328669559744,0.7861243498535414 +B2,260742.1875,-37.45254792647121,0.042045371560211375,0.5135157980340543 +B2,262695.3125,-39.51677327482676,0.002156865571977029,0.23735521595013104 +B2,263671.875,-38.574022322692386,0.009681280178372553,0.7147537722694316 +B2,264648.4375,-37.7171295548591,0.03757441827871588,0.5405960001514822 +B2,266601.5625,-38.165462996156386,-0.03488889078477486,0.3586873255042118 +B2,267578.125,-38.05198901717718,-0.002629640309949277,0.7998355863171269 +B2,268554.6875,-37.57088856893243,0.016747589141425046,0.6042154270674606 +B2,270507.8125,-39.014704216874335,0.05007899701340879,0.27616269407411703 +B2,271484.375,-38.463160247642556,-0.02215183659678832,0.7765787633193691 +B2,272460.9375,-37.930741568338384,-0.02069273111452663,0.6223353802236787 +B2,274414.0625,-39.24949527400061,-0.08207000394188046,0.2256777305700134 +B2,275390.625,-38.35541337622637,-0.03582834354108444,0.7548396042646164 +B2,276367.1875,-37.97669796356792,-0.013558038332051492,0.5723587616984569 +B2,278320.3125,-40.14399554823096,0.12125264993790852,0.1505581260960138 +B2,279296.875,-38.14087569098606,0.035948590773703604,0.6924703461406351 +B2,280273.4375,-37.66240844947514,0.05040926999233042,0.530888738252455 +B2,282226.5625,-40.976820167359975,-0.07994260183523982,0.09398362306367748 +B2,283203.125,-38.61599354272593,-0.01705826139945854,0.6458434858858215 +B2,284179.6875,-38.1802163702567,-0.024173338570329772,0.5167790982885803 +B2,286132.8125,-39.53172940944418,0.1932108933550989,0.11376847576678661 +B2,287109.375,-38.36220254394205,0.022911574529458356,0.633584414977475 +B2,288085.9375,-38.0371049949668,0.02294268856567694,0.4625361733155547 +B2,290039.0625,-38.850994867371064,-0.18714994931119167,0.0879941634318386 +B2,291015.625,-38.37056060931136,-0.048849397689958884,0.5914583696001547 +B2,291992.1875,-38.16057001546715,-0.03731518794983657,0.49679280209633575 +B2,294921.875,-38.462762818413005,-0.03654342398291899,0.5591225611254447 +B2,295898.4375,-38.21174390203293,-0.010303413788395943,0.4762393975871065 +B2,298828.125,-37.827152718031975,0.022162046647425715,0.5307607030069976 +B2,299804.6875,-37.452413728391235,0.03490804355705812,0.46993571511655974 +B2,302734.375,-38.67103818734769,0.04166131613499324,0.40029769651491565 +B2,303710.9375,-38.30679197079812,0.05493993017165266,0.36616141203915503 +B2,306640.625,-39.031293025427075,-0.05982131948531322,0.33346093662528326 +B2,307617.1875,-38.62937212650376,-0.06980865401721159,0.33554560469976297 +B2,310546.875,-38.87869444948575,-0.029156405031208976,0.26691437321514117 +B2,311523.4375,-38.761303418487024,-0.05226088210720725,0.2864121232907913 +B2,314453.125,-39.11232639786638,-0.06179358806315527,0.20664974660251226 +B2,315429.6875,-38.534047661814114,0.0073606904942136175,0.22534982212976476 +B2,318359.375,-38.88947906959855,-0.09546670505933719,0.16905622428515432 +B2,319335.9375,-38.68860664018036,-0.08264253563414803,0.18660823057880446 +B2,322265.625,-39.54304917543488,-0.09184604153400011,0.09216830199958251 +B2,323242.1875,-39.224036474908736,-0.1336747371885756,0.12402377235678999 diff --git a/data/processed/lab058/channel_transfer.png b/data/processed/lab058/channel_transfer.png new file mode 100644 index 0000000..280f4d8 Binary files /dev/null and b/data/processed/lab058/channel_transfer.png differ diff --git a/data/processed/lab058/constellation_a_vs_b.png b/data/processed/lab058/constellation_a_vs_b.png new file mode 100644 index 0000000..756c3f6 Binary files /dev/null and b/data/processed/lab058/constellation_a_vs_b.png differ diff --git a/data/processed/lab058/diagnostic_isi.png b/data/processed/lab058/diagnostic_isi.png new file mode 100644 index 0000000..97cf571 Binary files /dev/null and b/data/processed/lab058/diagnostic_isi.png differ diff --git a/data/processed/lab058/eye_a.png b/data/processed/lab058/eye_a.png new file mode 100644 index 0000000..7253a0d Binary files /dev/null and b/data/processed/lab058/eye_a.png differ diff --git a/data/processed/lab058/eye_b.png b/data/processed/lab058/eye_b.png new file mode 100644 index 0000000..48b6a3f Binary files /dev/null and b/data/processed/lab058/eye_b.png differ diff --git a/data/processed/lab058/segment_metrics.csv b/data/processed/lab058/segment_metrics.csv new file mode 100644 index 0000000..1f5425d --- /dev/null +++ b/data/processed/lab058/segment_metrics.csv @@ -0,0 +1,9 @@ +label,symbol_rate,analysis_mode,errors,symbols,ber,plus_mean,plus_std,minus_mean,minus_std,cloud_separation_sigma,evm_rms,matched_component_power,residual_power,matched_residual_db,margin_median,margin_p10,margin_p01,timing_fraction,cfo_hz,eye_opening,isi_ratio_db,channel_ripple_db +A1,20000,receiver_like,1,2816,0.0003551136363636364,0.9880681326979883,0.15648583583715736,-0.9856267799709301,0.16945752044704543,12.101082783161676,0.31642307417060406,127.30175120186958,12.745904762311103,9.994637088848515,1.0140433795840895,0.7899864118520403,0.4377447808978921,0.005,0.05578903039015779,,, +A1,20000,oracle,0,1536,0.0,1.0012684809963817,0.1591520779959967,-1.0097505840001473,0.16641220325175363,12.350981551919041,0.3145802767715763,124.70914553865235,12.34131064091916,10.045370196097327,1.027809668261911,0.8134464053956763,0.4432253875556976,0.0,-0.01750874609532253,2.011019064996529,-34.48481011797861,0.42744563312360384 +B1,500000,receiver_like,53110,101120,0.5252175632911392,-0.0454563230499973,0.8741108017316369,0.04662327857775051,0.8735221665255701,-0.10537635542147922,1.627914243358283,5.039845113113856,13.356117643515095,-4.232630460483268,-0.0749068280072387,-1.1522860266119301,-1.8219752970381689,0.0,4.668990755640429,,, +B1,500000,oracle,1625,50688,0.03205886994949495,1.0038798532842312,0.529822170298403,-1.0014451905936077,0.5182158275348242,3.826582798530514,0.8150734836811827,4.750902189471545,3.1562370879202715,1.776064705725458,1.0383194984792974,0.44558459778809906,-0.7473909193349014,-0.03125,-0.061664567120971146,2.0221327626996053,-30.266350888049665,4.532105058230293 +A2,20000,receiver_like,0,2816,0.0,1.0021698877382776,0.17517393918188917,-1.0024512759126043,0.16704088981966111,11.712264400188428,0.33212139607349384,119.16645960129603,13.144611249201235,9.574062903730379,1.030798396020773,0.7973344156274578,0.39794039729378256,0.0,-0.13866849385025318,,, +A2,20000,oracle,0,1536,0.0,0.9977253051585244,0.16898140247082657,-0.9871010298668412,0.1679864412015912,11.780457513231198,0.32020059920935173,121.29032528645918,12.435705865808165,9.89155719392642,1.0233283127955501,0.7809803024446145,0.40296058277799685,0.0,0.007241046431241284,1.9848263350253657,-32.154237627215615,0.38600804813078327 +B2,500000,receiver_like,52898,101120,0.5231210443037975,-0.03965927594451565,0.9153949378638604,0.037608559281639885,0.9219659530864524,-0.08410687467817614,1.6786285118041953,4.662839201920867,13.138918837022253,-4.499091908176917,-0.06971458856811955,-1.1852259871865864,-1.9044511604526417,-0.0625,4.742179029785673,,, +B2,500000,oracle,1919,50688,0.037859059343434344,0.9970549669625041,0.5721636737651704,-1.0002893453921478,0.5792017459003083,3.469458023525076,0.8756260665627654,4.62511430417931,3.5461723034699646,1.153626367484854,1.0295281840215331,0.40799559678633845,-0.8916404606042253,-0.03125,-0.018668146565430317,1.9648355420847208,-29.934890653519595,6.41065794417576 diff --git a/data/processed/lab058/summary.json b/data/processed/lab058/summary.json new file mode 100644 index 0000000..548efab --- /dev/null +++ b/data/processed/lab058/summary.json @@ -0,0 +1,1420 @@ +{ + "lab": "Lab058", + "status": "COMPLETED", + "scope": "OFFLINE_SAVED_LAB056_ONLY", + "rf_tx": 0, + "hardware_access": 0, + "integrity": { + "tx": { + "path": "data\\raw\\lab056\\tx_abab.cs8", + "bytes": 21177088, + "sha256": "5b34bbe1a8e6d037d2d6d367a74e9eb84e8940db7da61600ffaa7f7497d4f600", + "expected_sha256": "5b34bbe1a8e6d037d2d6d367a74e9eb84e8940db7da61600ffaa7f7497d4f600" + }, + "rx": { + "path": "data\\raw\\lab056\\rx_stream.cs8", + "bytes": 48000000, + "sha256": "e336dd653fa554058052fcf851e9f2462f66b8cf7c710815ca2b9a09ffc23ad4", + "expected_sha256": "e336dd653fa554058052fcf851e9f2462f66b8cf7c710815ca2b9a09ffc23ad4" + } + }, + "method": { + "tiles": 64, + "training_tiles": "even", + "validation_tiles": "odd", + "guard_symbols_each_tile_edge": 8, + "oracle_dc_source": "guarded_even_training_raw_intervals_only", + "timing_grid_symbol": [ + -0.5, + -0.46875, + -0.4375, + -0.40625, + -0.375, + -0.34375, + -0.3125, + -0.28125, + -0.25, + -0.21875, + -0.1875, + -0.15625, + -0.125, + -0.09375, + -0.0625, + -0.03125, + 0.0, + 0.03125, + 0.0625, + 0.09375, + 0.125, + 0.15625, + 0.1875, + 0.21875, + 0.25, + 0.28125, + 0.3125, + 0.34375, + 0.375, + 0.40625, + 0.4375, + 0.46875, + 0.5 + ], + "isi_offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ] + }, + "segments": [ + { + "label": "A1", + "symbol_rate": 20000, + "samples_per_symbol": 400, + "rx_start": 5254791, + "receiver_like": { + "timing_fraction": 0.005, + "timing_samples": 2.0, + "cfo_hz": 0.05578903039015779, + "h": { + "real": -7.472778734762145, + "imag": 8.453362004738482 + }, + "train_coherence": null, + "metrics": { + "errors": 1, + "symbols": 2816, + "ber": 0.0003551136363636364, + "plus_mean": 0.9880681326979883, + "plus_std": 0.15648583583715736, + "minus_mean": -0.9856267799709301, + "minus_std": 0.16945752044704543, + "cloud_separation_sigma": 12.101082783161676, + "evm_rms": 0.31642307417060406, + "matched_component_power": 127.30175120186958, + "residual_power": 12.745904762311103, + "matched_residual_db": 9.994637088848515, + "margin_median": 1.0140433795840895, + "margin_p10": 0.7899864118520403, + "margin_p01": 0.4377447808978921 + } + }, + "oracle": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": -0.01750874609532253, + "h": { + "real": -7.574069509049399, + "imag": 8.206254724948558 + }, + "train_coherence": 0.9078480198039002, + "metrics": { + "errors": 0, + "symbols": 1536, + "ber": 0.0, + "plus_mean": 1.0012684809963817, + "plus_std": 0.1591520779959967, + "minus_mean": -1.0097505840001473, + "minus_std": 0.16641220325175363, + "cloud_separation_sigma": 12.350981551919041, + "evm_rms": 0.3145802767715763, + "matched_component_power": 124.70914553865235, + "residual_power": 12.34131064091916, + "matched_residual_db": 10.045370196097327, + "margin_median": 1.027809668261911, + "margin_p10": 0.8134464053956763, + "margin_p01": 0.4432253875556976 + }, + "eye": { + "opening": 2.011019064996529, + "opening_at_minus_0p1": 1.9706626697707625, + "opening_at_plus_0p1": 1.9739889368342844, + "drop_minus_0p1_percent": 2.00676343293823, + "drop_plus_0p1_percent": 1.8413613678152085 + }, + "isi": { + "main_tap_power": 124.16740356370659, + "adjacent_taps_power": 0.04421061822725236, + "isi_ratio_db": -34.48481011797861, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": 0.09390249177289557, + "imag": -0.03629889028159058 + }, + { + "real": 0.025134658921546205, + "imag": 0.014303063184472276 + }, + { + "real": 0.006779467005429418, + "imag": -0.07441860549349477 + }, + { + "real": -0.015369582396407733, + "imag": 0.0488592464854507 + }, + { + "real": -0.024826614484704024, + "imag": -0.032170784667670094 + }, + { + "real": -7.553659255483426, + "imag": 8.192047083345905 + }, + { + "real": 0.043594550568177404, + "imag": 0.08766272984801593 + }, + { + "real": -0.037059146102871754, + "imag": 0.023517395580225697 + }, + { + "real": -0.020450498660629313, + "imag": -0.05151788668045487 + }, + { + "real": 0.013157553235551567, + "imag": -0.04948863886928412 + }, + { + "real": 0.06302256339988954, + "imag": 0.04692599537197384 + } + ] + }, + "channel": { + "stable": true, + "bins": 27, + "median_coherence": 0.9065285470486301, + "amplitude_ripple_p95_p05_db": 0.42744563312360384, + "max_min_gain_db": 0.9446201096716109, + "gain_slope_db_per_mhz": -12.041509675506465, + "common_group_delay_seconds": 1.5395834629939142e-08, + "residual_phase_ripple_p95_p05_rad": 0.042041730950448164, + "group_delay_stable": false, + "group_delay_variation_p95_p05_seconds": null, + "band_edge_hz": 13500.0, + "tx_psd_threshold_db": -20.0 + } + } + }, + { + "label": "B1", + "symbol_rate": 500000, + "samples_per_symbol": 16, + "rx_start": 7709991, + "receiver_like": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": 4.668990755640429, + "h": { + "real": -1.4423830029567033, + "imag": 1.7202838096940452 + }, + "train_coherence": null, + "metrics": { + "errors": 53110, + "symbols": 101120, + "ber": 0.5252175632911392, + "plus_mean": -0.0454563230499973, + "plus_std": 0.8741108017316369, + "minus_mean": 0.04662327857775051, + "minus_std": 0.8735221665255701, + "cloud_separation_sigma": -0.10537635542147922, + "evm_rms": 1.627914243358283, + "matched_component_power": 5.039845113113856, + "residual_power": 13.356117643515095, + "matched_residual_db": -4.232630460483268, + "margin_median": -0.0749068280072387, + "margin_p10": -1.1522860266119301, + "margin_p01": -1.8219752970381689 + } + }, + "oracle": { + "timing_fraction": -0.03125, + "timing_samples": -0.5, + "cfo_hz": -0.061664567120971146, + "h": { + "real": -1.4156436298597284, + "imag": 1.6573639620521246 + }, + "train_coherence": 0.6108125653954393, + "metrics": { + "errors": 1625, + "symbols": 50688, + "ber": 0.03205886994949495, + "plus_mean": 1.0038798532842312, + "plus_std": 0.529822170298403, + "minus_mean": -1.0014451905936077, + "minus_std": 0.5182158275348242, + "cloud_separation_sigma": 3.826582798530514, + "evm_rms": 0.8150734836811827, + "matched_component_power": 4.750902189471545, + "residual_power": 3.1562370879202715, + "matched_residual_db": 1.776064705725458, + "margin_median": 1.0383194984792974, + "margin_p10": 0.44558459778809906, + "margin_p01": -0.7473909193349014 + }, + "eye": { + "opening": 2.0221327626996053, + "opening_at_minus_0p1": 1.9912023012182731, + "opening_at_plus_0p1": 1.9827638631617126, + "drop_minus_0p1_percent": 1.5295959816228444, + "drop_plus_0p1_percent": 1.9468998408064042 + }, + "isi": { + "main_tap_power": 4.747495848398725, + "adjacent_taps_power": 0.004465082676763783, + "isi_ratio_db": -30.266350888049665, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": -0.00521252231034679, + "imag": -0.015782301649054892 + }, + { + "real": -0.006397182805938595, + "imag": -0.0003895459779533761 + }, + { + "real": -0.004754518607346048, + "imag": 0.006023510795448467 + }, + { + "real": -0.0027752863144991646, + "imag": 0.005896236380451003 + }, + { + "real": 0.003370579931314399, + "imag": -0.0006321078086128362 + }, + { + "real": -1.4167901780809669, + "imag": 1.6553553816905984 + }, + { + "real": 0.00037388283947981105, + "imag": -0.01370250299932027 + }, + { + "real": -0.015345166591833562, + "imag": -0.029515050413973898 + }, + { + "real": -0.02813780456082271, + "imag": -0.017025377178092715 + }, + { + "real": -0.03002326895353072, + "imag": 0.005949955365823212 + }, + { + "real": -0.024999461977937787, + "imag": 0.00983652664744028 + } + ] + }, + "channel": { + "stable": true, + "bins": 516, + "median_coherence": 0.5669831181755846, + "amplitude_ripple_p95_p05_db": 4.532105058230293, + "max_min_gain_db": 21.95810816672968, + "gain_slope_db_per_mhz": 0.050674493928618294, + "common_group_delay_seconds": -5.6882849159732694e-08, + "residual_phase_ripple_p95_p05_rad": 0.34302285569581525, + "group_delay_stable": false, + "group_delay_variation_p95_p05_seconds": null, + "band_edge_hz": 337500.0, + "tx_psd_threshold_db": -20.0 + } + } + }, + { + "label": "A2", + "symbol_rate": 20000, + "samples_per_symbol": 400, + "rx_start": 10149062, + "receiver_like": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": -0.13866849385025318, + "h": { + "real": -6.360018670028123, + "imag": 8.872238844744302 + }, + "train_coherence": null, + "metrics": { + "errors": 0, + "symbols": 2816, + "ber": 0.0, + "plus_mean": 1.0021698877382776, + "plus_std": 0.17517393918188917, + "minus_mean": -1.0024512759126043, + "minus_std": 0.16704088981966111, + "cloud_separation_sigma": 11.712264400188428, + "evm_rms": 0.33212139607349384, + "matched_component_power": 119.16645960129603, + "residual_power": 13.144611249201235, + "matched_residual_db": 9.574062903730379, + "margin_median": 1.030798396020773, + "margin_p10": 0.7973344156274578, + "margin_p01": 0.39794039729378256 + } + }, + "oracle": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": 0.007241046431241284, + "h": { + "real": -6.073223705739459, + "imag": 9.187288996570397 + }, + "train_coherence": 0.9079065473306508, + "metrics": { + "errors": 0, + "symbols": 1536, + "ber": 0.0, + "plus_mean": 0.9977253051585244, + "plus_std": 0.16898140247082657, + "minus_mean": -0.9871010298668412, + "minus_std": 0.1679864412015912, + "cloud_separation_sigma": 11.780457513231198, + "evm_rms": 0.32020059920935173, + "matched_component_power": 121.29032528645918, + "residual_power": 12.435705865808165, + "matched_residual_db": 9.89155719392642, + "margin_median": 1.0233283127955501, + "margin_p10": 0.7809803024446145, + "margin_p01": 0.40296058277799685 + }, + "eye": { + "opening": 1.9848263350253657, + "opening_at_minus_0p1": 1.9460176675511314, + "opening_at_plus_0p1": 1.9471970759005641, + "drop_minus_0p1_percent": 1.9552676619306486, + "drop_plus_0p1_percent": 1.895846425491965 + }, + "isi": { + "main_tap_power": 120.6216246901936, + "adjacent_taps_power": 0.07345162547276263, + "isi_ratio_db": -32.154237627215615, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": 0.03479142600943515, + "imag": -0.03594259849592012 + }, + { + "real": -0.034900878980347994, + "imag": 0.01893256095286855 + }, + { + "real": -0.004338465336043651, + "imag": -0.062379608708905354 + }, + { + "real": 0.06288691333139573, + "imag": 0.07502049043597103 + }, + { + "real": -0.07234987815777971, + "imag": 0.0024240760234959247 + }, + { + "real": -6.072598667988088, + "imag": 9.151238719853334 + }, + { + "real": 0.06598943767179999, + "imag": 0.05328497684754274 + }, + { + "real": 0.01023089977300895, + "imag": -0.08043358881250173 + }, + { + "real": -0.049806481968489136, + "imag": -0.04872543433212506 + }, + { + "real": -0.009829974969325916, + "imag": 0.05490171210424477 + }, + { + "real": 0.02662598266879246, + "imag": -0.1679190004185358 + } + ] + }, + "channel": { + "stable": true, + "bins": 27, + "median_coherence": 0.8989458906921672, + "amplitude_ripple_p95_p05_db": 0.38600804813078327, + "max_min_gain_db": 0.63699900433663, + "gain_slope_db_per_mhz": -12.578018822913036, + "common_group_delay_seconds": 3.040259248212665e-07, + "residual_phase_ripple_p95_p05_rad": 0.04192573131848816, + "group_delay_stable": false, + "group_delay_variation_p95_p05_seconds": null, + "band_edge_hz": 13500.0, + "tx_psd_threshold_db": -20.0 + } + } + }, + { + "label": "B2", + "symbol_rate": 500000, + "samples_per_symbol": 16, + "rx_start": 12604263, + "receiver_like": { + "timing_fraction": -0.0625, + "timing_samples": -1.0, + "cfo_hz": 4.742179029785673, + "h": { + "real": -1.0469452247986033, + "imag": 1.8885827750438338 + }, + "train_coherence": null, + "metrics": { + "errors": 52898, + "symbols": 101120, + "ber": 0.5231210443037975, + "plus_mean": -0.03965927594451565, + "plus_std": 0.9153949378638604, + "minus_mean": 0.037608559281639885, + "minus_std": 0.9219659530864524, + "cloud_separation_sigma": -0.08410687467817614, + "evm_rms": 1.6786285118041953, + "matched_component_power": 4.662839201920867, + "residual_power": 13.138918837022253, + "matched_residual_db": -4.499091908176917, + "margin_median": -0.06971458856811955, + "margin_p10": -1.1852259871865864, + "margin_p01": -1.9044511604526417 + } + }, + "oracle": { + "timing_fraction": -0.03125, + "timing_samples": -0.5, + "cfo_hz": -0.018668146565430317, + "h": { + "real": -1.2122695591579504, + "imag": 1.776377443033518 + }, + "train_coherence": 0.5736309046692175, + "metrics": { + "errors": 1919, + "symbols": 50688, + "ber": 0.037859059343434344, + "plus_mean": 0.9970549669625041, + "plus_std": 0.5721636737651704, + "minus_mean": -1.0002893453921478, + "minus_std": 0.5792017459003083, + "cloud_separation_sigma": 3.469458023525076, + "evm_rms": 0.8756260665627654, + "matched_component_power": 4.62511430417931, + "residual_power": 3.5461723034699646, + "matched_residual_db": 1.153626367484854, + "margin_median": 1.0295281840215331, + "margin_p10": 0.40799559678633845, + "margin_p01": -0.8916404606042253 + }, + "eye": { + "opening": 1.9648355420847208, + "opening_at_minus_0p1": 1.927195687843167, + "opening_at_plus_0p1": 1.93320940097965, + "drop_minus_0p1_percent": 1.9156745404563136, + "drop_plus_0p1_percent": 1.609607543617353 + }, + "isi": { + "main_tap_power": 4.6212289779663305, + "adjacent_taps_power": 0.0046910322928666, + "isi_ratio_db": -29.934890653519595, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": 0.01109149198081217, + "imag": -0.015195335939895525 + }, + { + "real": -0.01186601700861284, + "imag": -0.005392557515744856 + }, + { + "real": -0.007677749484460289, + "imag": -0.006869807907963182 + }, + { + "real": -0.02065138275041134, + "imag": -0.0017158859729757558 + }, + { + "real": -0.001868405272655499, + "imag": -0.002433000067102259 + }, + { + "real": -1.213000689329217, + "imag": 1.7747840166209452 + }, + { + "real": -0.0018213550143233725, + "imag": -0.01493991559564628 + }, + { + "real": -0.015715116171022184, + "imag": -0.03340001463096676 + }, + { + "real": -0.018504510973480992, + "imag": -0.007633963221892498 + }, + { + "real": -0.02878716923628717, + "imag": 0.01522426720953221 + }, + { + "real": -0.019015325719341822, + "imag": 0.01450702605278989 + } + ] + }, + "channel": { + "stable": true, + "bins": 516, + "median_coherence": 0.5352752984261608, + "amplitude_ripple_p95_p05_db": 6.41065794417576, + "max_min_gain_db": 23.965731382372585, + "gain_slope_db_per_mhz": -0.2550743998628934, + "common_group_delay_seconds": -4.8997634685072236e-08, + "residual_phase_ripple_p95_p05_rad": 0.26830925968490527, + "group_delay_stable": false, + "group_delay_variation_p95_p05_seconds": null, + "band_edge_hz": 337500.0, + "tx_psd_threshold_db": -20.0 + } + } + } + ], + "comparison": { + "symbol_ber": { + "a_mean": 0.0, + "b_mean": 0.03495896464646465, + "b_minus_a": 0.03495896464646465 + }, + "evm_rms": { + "a_mean": 0.317390437990464, + "b_mean": 0.8453497751219741, + "b_minus_a": 0.5279593371315101 + }, + "matched_residual_db": { + "a_mean": 9.968463695011874, + "b_mean": 1.4648455366051558, + "b_minus_a": -8.503618158406718 + }, + "decision_margin_median": { + "a_mean": 1.0255689905287304, + "b_mean": 1.0339238412504153, + "b_minus_a": 0.008354850721684848 + }, + "eye_opening": { + "a_mean": 1.9979227000109474, + "b_mean": 1.993484152392163, + "b_minus_a": -0.004438547618784483 + }, + "isi_ratio_db": { + "a_mean": -33.31952387259712, + "b_mean": -30.10062077078463, + "b_minus_a": 3.2189031018124865 + }, + "channel_ripple_db": { + "a_mean": 0.40672684062719355, + "b_mean": 5.471381501203027, + "b_minus_a": 5.064654660575833 + } + }, + "repeatability": { + "A": { + "symbol_ber": { + "absolute_second_minus_first": 0.0, + "relative_second_minus_first": null, + "difference_db": null + }, + "evm_rms": { + "absolute_second_minus_first": 0.005620322437775438, + "relative_second_minus_first": 0.017866099221015303, + "difference_db": 0.1538130021709075 + }, + "matched_residual_db": { + "absolute_second_minus_first": -0.15381300217090654, + "relative_second_minus_first": -0.01531183014346884, + "difference_db": -0.15381300217090654 + }, + "decision_margin_median": { + "absolute_second_minus_first": -0.004481355466360748, + "relative_second_minus_first": -0.004360102463269289, + "difference_db": null + }, + "eye_opening": { + "absolute_second_minus_first": -0.02619272997116351, + "relative_second_minus_first": -0.01302460549831173, + "difference_db": -0.11387348491208091 + }, + "isi_ratio_db": { + "absolute_second_minus_first": 2.3305724907629966, + "relative_second_minus_first": 0.06758258151312702, + "difference_db": 2.3305724907629966 + }, + "channel_ripple_db": { + "absolute_second_minus_first": -0.041437584992820575, + "relative_second_minus_first": -0.09694235191973087, + "difference_db": -0.041437584992820575 + } + }, + "B": { + "symbol_ber": { + "absolute_second_minus_first": 0.005800189393939392, + "relative_second_minus_first": 0.18092307692307685, + "difference_db": 0.7222160942057837 + }, + "evm_rms": { + "absolute_second_minus_first": 0.06055258288158272, + "relative_second_minus_first": 0.07429094933637659, + "difference_db": 0.6224383382406045 + }, + "matched_residual_db": { + "absolute_second_minus_first": -0.622438338240604, + "relative_second_minus_first": -0.3504592688735181, + "difference_db": -0.622438338240604 + }, + "decision_margin_median": { + "absolute_second_minus_first": -0.008791314457764265, + "relative_second_minus_first": -0.008466868310418763, + "difference_db": null + }, + "eye_opening": { + "absolute_second_minus_first": -0.057297220614884514, + "relative_second_minus_first": -0.028335043906014896, + "difference_db": -0.24966920359922065 + }, + "isi_ratio_db": { + "absolute_second_minus_first": 0.3314602345300699, + "relative_second_minus_first": 0.010951443593450948, + "difference_db": 0.3314602345300699 + }, + "channel_ripple_db": { + "absolute_second_minus_first": 1.8785528859454672, + "relative_second_minus_first": 0.4144989716277691, + "difference_db": 1.8785528859454672 + } + } + }, + "controls": { + "tx": { + "A": { + "receiver_like": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": 6.513082509775189e-06, + "h": { + "real": 884.5862449402974, + "imag": -0.0212009949236157 + }, + "train_coherence": null, + "metrics": { + "errors": 0, + "symbols": 2816, + "ber": 0.0, + "plus_mean": 0.9999897588946253, + "plus_std": 0.010377209584425265, + "minus_mean": -0.9999995563040467, + "minus_std": 0.010311228829789907, + "cloud_separation_sigma": 193.3426877297657, + "evm_rms": 0.010349122117621663, + "matched_component_power": 782492.825187058, + "residual_power": 83.8083686802384, + "matched_residual_db": 39.70192976866826, + "margin_median": 1.0000296777901712, + "margin_p10": 0.9851762782567761, + "margin_p01": 0.980723176844337 + } + }, + "oracle": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": 5.036062900621972e-05, + "h": { + "real": 886.4229468009039, + "imag": -0.0826028018113038 + }, + "train_coherence": 0.9998931432955329, + "metrics": { + "errors": 0, + "symbols": 1536, + "ber": 0.0, + "plus_mean": 0.995535522432009, + "plus_std": 0.010151574242697624, + "minus_mean": -0.9969871758767553, + "minus_std": 0.010560523672353475, + "cloud_separation_sigma": 192.36433057930296, + "evm_rms": 0.01104742821315129, + "matched_component_power": 785745.6474384208, + "residual_power": 95.89685408921275, + "matched_residual_db": 39.13477623655993, + "margin_median": 0.9961738250809284, + "margin_p10": 0.9823425257800902, + "margin_p01": 0.9763389485289011 + }, + "eye": { + "opening": 1.9925226983087643, + "opening_at_minus_0p1": 1.9541591762562507, + "opening_at_plus_0p1": 1.9544813747996848, + "drop_minus_0p1_percent": 1.9253744052740829, + "drop_plus_0p1_percent": 1.9092040226878493 + }, + "isi": { + "main_tap_power": 782787.8137259753, + "adjacent_taps_power": 78.65666851991014, + "isi_ratio_db": -39.979085079865044, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": -6.129314452522473, + "imag": -0.0071682073392290106 + }, + { + "real": 1.4438349030355653, + "imag": -0.02198658204897186 + }, + { + "real": -0.7425534239749894, + "imag": -0.02044121307180411 + }, + { + "real": -0.279533364977965, + "imag": -0.07387881154118689 + }, + { + "real": 0.007188166143137664, + "imag": 0.002857957791269638 + }, + { + "real": 884.752963068994, + "imag": -0.08981431280482578 + }, + { + "real": 0.009877174465117378, + "imag": -0.02318836987035459 + }, + { + "real": -0.14224175710963038, + "imag": -0.02417852519057709 + }, + { + "real": -0.8282790103382922, + "imag": -0.008490076482108762 + }, + { + "real": 1.5716269729117727, + "imag": 0.03163043694075963 + }, + { + "real": -5.932025973402773, + "imag": 0.0019593187267226073 + } + ] + } + } + }, + "B": { + "receiver_like": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": 0.0017522184591436322, + "h": { + "real": 176.04344633462534, + "imag": 0.0053752143257297215 + }, + "train_coherence": null, + "metrics": { + "errors": 0, + "symbols": 101120, + "ber": 0.0, + "plus_mean": 0.9998567644532363, + "plus_std": 0.009774116602916102, + "minus_mean": -1.0001213824360415, + "minus_std": 0.009973776006496607, + "cloud_separation_sigma": 202.54069382403452, + "evm_rms": 0.010062186260756145, + "matched_component_power": 30991.295026265034, + "residual_power": 3.1377940050985402, + "matched_residual_db": 39.94615295453678, + "margin_median": 1.00006337760022, + "margin_p10": 0.9859708513696395, + "margin_p01": 0.9803399692203754 + } + }, + "oracle": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": 2.683971771204913e-06, + "h": { + "real": 176.04204607161287, + "imag": 0.007841016946060058 + }, + "train_coherence": 0.9999004357444503, + "metrics": { + "errors": 0, + "symbols": 50688, + "ber": 0.0, + "plus_mean": 0.999866166506798, + "plus_std": 0.009776296078932996, + "minus_mean": -1.0001368834185382, + "minus_std": 0.00997261669151326, + "cloud_separation_sigma": 202.53309741299728, + "evm_rms": 0.009981196058769256, + "matched_component_power": 30990.80204656143, + "residual_power": 3.0874361782306927, + "matched_residual_db": 40.01634827124734, + "margin_median": 1.0001134517824197, + "margin_p10": 0.9859153415435489, + "margin_p01": 0.9804156805757666 + }, + "eye": { + "opening": 1.9999723081410574, + "opening_at_minus_0p1": 1.9658456480353808, + "opening_at_plus_0p1": 1.963643975416207, + "drop_minus_0p1_percent": 1.7063566313774037, + "drop_plus_0p1_percent": 1.816441786567391 + }, + "isi": { + "main_tap_power": 30985.179056240002, + "adjacent_taps_power": 2.7595588101826976, + "isi_ratio_db": -40.50314356238726, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": -1.1474576692660878, + "imag": -0.004363929452802402 + }, + { + "real": 0.23143658483361662, + "imag": 0.018256050832343933 + }, + { + "real": -0.12885325831062389, + "imag": 0.0034853010460325394 + }, + { + "real": 0.03671750378101102, + "imag": 0.03237896503069252 + }, + { + "real": 0.04073852676485856, + "imag": 0.0051719206319035815 + }, + { + "real": 176.02607475633744, + "imag": 0.007881389848322064 + }, + { + "real": 0.036880358265802826, + "imag": -0.01204817647798303 + }, + { + "real": 0.029303218794108687, + "imag": -0.025378452276988265 + }, + { + "real": -0.14063603831687388, + "imag": 0.0005402632929954266 + }, + { + "real": 0.2811188243398437, + "imag": -0.015735309579446695 + }, + { + "real": -1.1252516019026189, + "imag": -0.005728621510556638 + } + ] + } + } + } + }, + "awgn": { + "A": { + "receiver_like": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": -0.004426679983613782, + "h": { + "real": 884.4412979694682, + "imag": 0.36241050616572207 + }, + "train_coherence": null, + "metrics": { + "errors": 0, + "symbols": 2816, + "ber": 0.0, + "plus_mean": 1.00111966335088, + "plus_std": 0.018797749550936813, + "minus_mean": -0.9999956850120618, + "minus_std": 0.01905709763157354, + "cloud_separation_sigma": 105.72323149816663, + "evm_rms": 0.025182684430734473, + "matched_component_power": 782236.5408952925, + "residual_power": 496.06906596860136, + "matched_residual_db": 31.977959534352713, + "margin_median": 1.0007041926820426, + "margin_p10": 0.975661438579918, + "margin_p01": 0.9575885205334669 + } + }, + "oracle": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": -0.0006379333154358973, + "h": { + "real": 886.6228264340349, + "imag": 0.08722589019190936 + }, + "train_coherence": 0.9993740682318387, + "metrics": { + "errors": 0, + "symbols": 1536, + "ber": 0.0, + "plus_mean": 0.9956972321224369, + "plus_std": 0.01866217893286424, + "minus_mean": -0.9964670873092408, + "minus_std": 0.01910041963017835, + "cloud_separation_sigma": 105.50281267082758, + "evm_rms": 0.025028765550091626, + "matched_component_power": 786100.0439622328, + "residual_power": 492.4438079498603, + "matched_residual_db": 32.031211396172814, + "margin_median": 0.9960698490723182, + "margin_p10": 0.9711134757416309, + "margin_p01": 0.95358158983808 + }, + "eye": { + "opening": 1.9921643194316778, + "opening_at_minus_0p1": 1.9536466812657292, + "opening_at_plus_0p1": 1.9543214246738447, + "drop_minus_0p1_percent": 1.9334568835635446, + "drop_plus_0p1_percent": 1.8995870164278839 + }, + "isi": { + "main_tap_power": 783262.0318302953, + "adjacent_taps_power": 85.11652976324649, + "isi_ratio_db": -39.638931659383374, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": -5.793998968429816, + "imag": -0.023593262542385206 + }, + { + "real": 1.4080412227021952, + "imag": -0.4549942082942591 + }, + { + "real": -0.16298695977133804, + "imag": -0.30110215674893154 + }, + { + "real": 0.02064859308211453, + "imag": -0.3307650187403571 + }, + { + "real": 0.309064444315041, + "imag": 0.5365805554971309 + }, + { + "real": 885.0209165677537, + "imag": 0.09522535690687595 + }, + { + "real": 0.0910080216011977, + "imag": -0.19586755837389838 + }, + { + "real": -0.35814059755202265, + "imag": 0.20306540156049163 + }, + { + "real": -0.5297918645255493, + "imag": 0.1032077707879347 + }, + { + "real": 1.7572324030811473, + "imag": 0.1294669022945017 + }, + { + "real": -6.7014545714836515, + "imag": 0.47312976822679964 + } + ] + } + } + }, + "B": { + "receiver_like": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": 0.04037898173990897, + "h": { + "real": 175.27777100204278, + "imag": -0.08693490513998782 + }, + "train_coherence": null, + "metrics": { + "errors": 0, + "symbols": 101120, + "ber": 0.0, + "plus_mean": 1.0040224181648818, + "plus_std": 0.08125420094724763, + "minus_mean": -1.0039504235415844, + "minus_std": 0.0813752472826302, + "cloud_separation_sigma": 24.6938338334168, + "evm_rms": 0.11850495415908142, + "matched_component_power": 30722.30456512229, + "residual_power": 431.446354188274, + "matched_residual_db": 18.525269867511756, + "margin_median": 1.0039752969327065, + "margin_p10": 0.8997127436254889, + "margin_p01": 0.8163463200673281 + } + }, + "oracle": { + "timing_fraction": 0.0, + "timing_samples": 0.0, + "cfo_hz": -0.0009912895583992314, + "h": { + "real": 176.0367722273091, + "imag": 0.13339393169737163 + }, + "train_coherence": 0.9871515959945563, + "metrics": { + "errors": 0, + "symbols": 50688, + "ber": 0.0, + "plus_mean": 0.9998250729658988, + "plus_std": 0.08100443481314377, + "minus_mean": -1.0005687244635129, + "minus_std": 0.08093977343906261, + "cloud_separation_sigma": 24.70472589988206, + "evm_rms": 0.11405722542695437, + "matched_component_power": 30988.96297015051, + "residual_power": 403.1369895543662, + "matched_residual_db": 18.85754394669274, + "margin_median": 0.999982402070577, + "margin_p10": 0.8963587957270048, + "margin_p01": 0.8128675170415277 + }, + "eye": { + "opening": 2.0025208206440137, + "opening_at_minus_0p1": 1.9677783859327898, + "opening_at_plus_0p1": 1.966750265256305, + "drop_minus_0p1_percent": 1.734935005572169, + "drop_plus_0p1_percent": 1.7862763282633365 + }, + "isi": { + "main_tap_power": 30990.224042193913, + "adjacent_taps_power": 2.549281288274403, + "isi_ratio_db": -40.84806957695073, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": -1.196324469754717, + "imag": -0.13548507873502288 + }, + { + "real": 0.14933660891437484, + "imag": -0.037701456508014 + }, + { + "real": -0.08097720047146062, + "imag": 0.00682811558936201 + }, + { + "real": 0.10685055390831266, + "imag": -0.0835615069900362 + }, + { + "real": 0.08891458395416407, + "imag": -0.06641777037150186 + }, + { + "real": 176.04036136717014, + "imag": 0.12333657230511723 + }, + { + "real": 0.019927765912370887, + "imag": -0.04600172434955298 + }, + { + "real": 0.13409731239083733, + "imag": -0.04012201378857127 + }, + { + "real": -0.11658986375151414, + "imag": 0.06926078280385901 + }, + { + "real": 0.2656600054031024, + "imag": -0.016173874352948536 + }, + { + "real": -0.9629548857887862, + "imag": 0.008664032890655284 + } + ] + } + } + }, + "seed": 5801, + "complex_noise_variance_per_sample": 400.0, + "invariant": "same Fs, TX RMS and sampled complex-noise variance" + }, + "background": { + "rx_start": 2715712, + "receiver_like": { + "timing_fraction": -6.3125, + "timing_samples": -101.0, + "cfo_hz": -29.133337970264378, + "h": { + "real": -0.01986047982310726, + "imag": -0.05849245972700715 + }, + "train_coherence": null, + "metrics": { + "errors": 50871, + "symbols": 101120, + "ber": 0.5030755537974684, + "plus_mean": -0.03799755035178145, + "plus_std": 15.132308988987134, + "minus_mean": 0.11827902481379168, + "minus_std": 15.05454619207969, + "cloud_separation_sigma": -0.010353914357965534, + "evm_rms": 21.348424822547464, + "matched_component_power": 0.0038158065037196052, + "residual_power": 1.7390738180693384, + "matched_residual_db": -26.58731672903575, + "margin_median": -0.09891495380377506, + "margin_p10": -18.20048905729699, + "margin_p01": -38.62516058690014 + } + }, + "oracle": { + "timing_fraction": -0.25, + "timing_samples": -4.0, + "cfo_hz": -9.117514804615814, + "h": { + "real": 0.005702554064218044, + "imag": -0.006714119875822599 + }, + "train_coherence": 4.5002073505436716e-05, + "metrics": { + "errors": 25519, + "symbols": 50688, + "ber": 0.5034524936868687, + "plus_mean": -0.43935970546170944, + "plus_std": 104.77167790905268, + "minus_mean": 1.40330157916156, + "minus_std": 105.95862142721663, + "cloud_separation_sigma": -0.017488059966738825, + "evm_rms": 149.49360796217965, + "matched_component_power": 7.759852856224581e-05, + "residual_power": 1.7341982083627838, + "matched_residual_db": -43.49245247045295, + "margin_median": -0.8429723878918718, + "margin_p10": -127.67938067758777, + "margin_p01": -275.5341305131815 + }, + "eye": { + "opening": -1.3034669837316264, + "opening_at_minus_0p1": -0.7235126654057886, + "opening_at_plus_0p1": -1.963614624691312, + "drop_minus_0p1_percent": 44.49321122545945, + "drop_plus_0p1_percent": -50.64552069203809 + }, + "isi": { + "main_tap_power": 7.647037423125299e-05, + "adjacent_taps_power": 0.0005480654495122265, + "isi_ratio_db": 8.553392091133743, + "offsets": [ + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "taps": [ + { + "real": -0.0012389024795247587, + "imag": -0.0012173548093872724 + }, + { + "real": -0.00886504132706279, + "imag": -0.006510286303527443 + }, + { + "real": -0.0067951517213210785, + "imag": -0.008842987451860615 + }, + { + "real": -0.000503119650506418, + "imag": -0.0030182377670837177 + }, + { + "real": -0.0017666431499010543, + "imag": -0.01186684923776821 + }, + { + "real": 0.005739702073605882, + "imag": -0.006597438467882615 + }, + { + "real": -0.0011252506648279578, + "imag": -0.004795102265289222 + }, + { + "real": 0.00434487443571664, + "imag": -0.0010156323594078405 + }, + { + "real": 0.005295100278417262, + "imag": 0.0008499435029522733 + }, + { + "real": -0.0011203130015616227, + "imag": 0.00028200957728048096 + }, + { + "real": -0.008467184224179846, + "imag": -0.0006635680290765725 + } + ] + } + } + } + }, + "known_energy_per_symbol_difference_db": -13.870505, + "lab054_historical_result": "NOT_A, 0/16", + "lab058_commit": "NOT_PERFORMED", + "push": "NOT_PERFORMED" +} diff --git a/data/processed/lab058/symbol_quality_comparison.png b/data/processed/lab058/symbol_quality_comparison.png new file mode 100644 index 0000000..31ea905 Binary files /dev/null and b/data/processed/lab058/symbol_quality_comparison.png differ diff --git a/docs/LABS_INDEX.md b/docs/LABS_INDEX.md index d266f7e..df1b4de 100644 --- a/docs/LABS_INDEX.md +++ b/docs/LABS_INDEX.md @@ -476,3 +476,22 @@ [график](../data/processed/lab057/comparison.png), [проверки](../data/processed/lab057/acceptance.json). - **STOP:** исторический Lab054 NOT_A, 0/16 сохранён. Lab057 не коммитилась, push не выполнялся; следующий OFFLINE-анализ Lab056 требует отдельного согласования. + +## Lab058 — качество символов сохранённого ABAB Lab056 + +- **Запись 052; только сохранённые файлы, RF TX=0.** Lab057 зафиксирована коммитом + `5773136ebfa8bafdffc344462d0ce6b56838d3af`; Lab058 не закоммичена. +- **Oracle A/B:** BER 0%/3,4959%, EVM 0,3174/0,8453, matched/residual + 9,9685/1,4648 дБ. Энергия символа B/A из Lab056 −13,870505 дБ. +- **Receiver-like A/B:** BER 0,0178%/52,4169%; B оценивает CFO примерно +4,7 Гц, + тогда как oracle получает значение около нуля. Carrier synchronization — отдельный + подтверждённый практический предел текущего receiver. +- **Диагностика тракта:** eye opening 1,9979/1,9935; ISI ratio −33,3195/−30,1006 дБ; + H(f) ripple p95−p05 0,4067/5,4714 дБ. OTA не разделяет TX, канал и RX; group-delay + variation не объявлена устойчивой. +- **Контроли:** TX BER 0/0; synthetic AWGN движет EVM в ожидаемую сторону при одинаковой + noise PSD; background BER около 50%. Итог `MIXED`; Lab054 остаётся NOT_A, 0/16. +- [Постановка](lab058_current_state.md), [отчёт](lab058_offline_result.md), + [JSON](../data/processed/lab058/summary.json), + [CSV](../data/processed/lab058/segment_metrics.csv), + [H(f)](../data/processed/lab058/channel_transfer.png). STOP; push не выполнялся. diff --git a/docs/lab058_current_state.md b/docs/lab058_current_state.md new file mode 100644 index 0000000..35b2d93 --- /dev/null +++ b/docs/lab058_current_state.md @@ -0,0 +1,82 @@ +# Lab058 — исходное состояние и заранее зафиксированный план + +## Назначение и границы + +Lab058 измеряет качество BPSK-символов в уже сохранённом единственном OTA ABAB-сеансе +Lab056. Аппаратное оборудование не опрашивается, HackRF Plus не запускается, передача +не выполняется. Исторические данные Lab054 и Lab056 не изменяются. Все новые результаты +пишутся только в `data/processed/lab058/`. + +Исходный Git HEAD после отдельной фиксации Lab057: +`5773136ebfa8bafdffc344462d0ce6b56838d3af`. + +## Проверяемые исходные данные + +- `data/raw/lab056/tx_abab.cs8`: ожидаемый SHA-256 + `5b34bbe1a8e6d037d2d6d367a74e9eb84e8940db7da61600ffaa7f7497d4f600`; +- `data/raw/lab056/rx_stream.cs8`: ожидаемый SHA-256 + `e336dd653fa554058052fcf851e9f2462f66b8cf7c710815ca2b9a09ffc23ad4`; +- Fs = 8 Мвыб/с, цифровая несущая +50 кГц, RRC roll-off 0,35, span 10 символов, + guard 16 символов; +- A1/A2: 20 ксимв/с, 4096 полезных символов, 400 отсчётов/символ; +- B1/B2: 500 ксимв/с, 102400 полезных символов, 16 отсчётов/символ; +- границы burst и их уточнённые RX-start берутся из зафиксированного + `data/processed/lab056/rf_analysis.json`. + +Перед расчётом программа повторно проверяет существование, размер и SHA-256 обоих raw +файлов. Она также проверяет, что первые 1280 символов каждого burst точно совпадают с +действующей штатной PRBS7-преамбулой. + +## Два раздельных режима + +**Receiver-like.** Используется существующий RRC matched filter и действующие алгоритмы +timing/CFO/комплексного gain. Их оценки получают только 1280 известных приёмнику символов +преамбулы. Правильная полная TX-последовательность подключается после замораживания оценок +и служит только для подсчёта ошибок и диагностических метрик. Переданные границы burst, +унаследованные от Lab056, означают, что это анализ качества текущего приёмного тракта при +известной сегментации, а не независимый поиск пакета в трёхсекундном потоке. + +**Oracle diagnostic.** Известная полная TX PRBS разрешена для физической диагностики. +Timing выбирается на заранее фиксированной сетке из 33 точек от −0,5 до +0,5 символа. +Сеанс делится на 64 последовательные временные плитки: чётные плитки оценивают timing, +CFO и комплексный `h`, нечётные являются отложенной проверкой. По восемь символов у +каждой границы плитки заранее исключаются из обеих выборок, чтобы опоры RRC и sinc не +пересекали train/validation. Oracle matched filter оценивает постоянную составляющую +только по сырым отсчётам защищённых чётных плиток; нечётные плитки не участвуют в этой +nuisance-оценке. +Первичные BER, EVM, +matched/residual, decision margin и статистика облаков берутся с нечётных плиток. +Oracle не считается результатом штатного receiver. + +## Формулы и фиксированные критерии + +- `EVM_RMS = sqrt(mean(|r - h*s|^2) / mean(|h*s|^2))` на отложенных символах. +- `matched/residual = 10 log10(Pmatched / Presidual)`; это не объявляется Eb/N0. +- Signed decision margin равен `s * Re(r/h)`; отрицательное значение означает ошибку. + Публикуются median, p10 и p01. +- Eye opening — расстояние между средними действительной оси для `+1` и `−1` после + нормировки `h`. Временная ось задаётся в долях символа. Чувствительность — изменение + opening при offsets −0,10 и +0,10 символа относительно оптимального момента. +- Диагностический ISI-отклик оценивается одним и тем же МНК-базисом taps −5…+5 для A и B; + публикуется `10 log10(sum(|h[k!=0]|^2)/|h[0]|^2)`. Эквалайзер не применяется. +- `H(f)` получается как `Sxy/Sxx` из Hann-сегментов длиной 8192 с 50% overlap. + Используются только частоты внутри RRC-полосы и bins с TX PSD не ниже −20 dB от пика. + Публикуются p95−p05 ripple, max−min, линейный наклон, остаточная фаза после удаления + линейной задержки и variation group delay, только если число bins и coherence достаточны. +- A1, B1, A2, B2 считаются независимо; средние A/B строятся только после этого. + +## Контроли + +1. Сохранённый TX проходит тот же RRC/oracle тракт; ожидается BER = 0 в обоих режимах. +2. Воспроизводимый synthetic AWGN использует seed 5801 и комплексную дисперсию + 400 код² на отсчёт при Fs = 8 Мвыб/с и одинаковую среднюю TX-мощность. Инвариант — одна и + та же sampled noise PSD; при росте скорости и падении энергии символа метрики должны + ухудшаться в ожидаемую сторону. Этот контроль не подгоняет реальную запись. +3. Фоновое RX-окно до ABAB проверяется против BPSK-эталона и не должно выглядеть как + качественный BPSK-сигнал. + +Результат Lab056 `B/A energy per symbol = −13,870505 dB` используется только как известное +энергетическое сравнение. Lab058 не предполагает заранее AWGN-канал и не объявляет +частотно-зависимое искажение или многолучёвость доказанными без устойчивых оценок. + +RF TX = 0. Lab058 до результата не коммитируется. Push не выполняется. diff --git a/docs/lab058_offline_result.md b/docs/lab058_offline_result.md new file mode 100644 index 0000000..c490109 --- /dev/null +++ b/docs/lab058_offline_result.md @@ -0,0 +1,105 @@ +# Lab058 — качество BPSK-символов в сохранённом ABAB-сеансе Lab056 + +## Что произошло простыми словами + +Передатчик в Lab056 держал почти одинаковую среднюю цифровую мощность для 20 и 500 ксимв/с. При 500 ксимв/с за ту же секунду передавалось в 25 раз больше символов, поэтому на один символ пришлось примерно на 13,87 дБ меньше измеренной энергии. Полная принятая мощность при этом практически не изменилась. + +В сохранённой записи отдельные символы 500 ксимв/с действительно различаются хуже: после точного диагностического согласования BER вырос с 0% до 3,4959%, RMS EVM — с 0,317 до 0,845, а matched/residual снизился с 9,97 до 1,46 дБ. Но штатный приёмный тракт ухудшает B намного сильнее — до 52,42% BER. Он оценил остаточный CFO примерно как +4,7 Гц вместо близкого к нулю значения. За burst 0,2048 с эта ошибка поворачивает фазу почти на полный оборот и перемешивает решения. + +Установлены два разных эффекта. Физическое качество широкополосного B хуже и совместимо с меньшей энергией символа; кроме того, штатная синхронизация B в этой записи явно не удерживает фазу. Оценка H(f) показывает большее широкополосное изменение амплитуды, но OTA-тракт включает обе платы, кабели, антенны и распространение. По нему нельзя приписать эффект одному HackRF Plus. Абсолютная RF-мощность в dBm, шумовая фигура и истинный Eb/N0 требуют калиброванного измерительного тракта; приведённые значения — цифровые диагностические метрики сохранённых IQ. + +## Целостность и границы + +| Файл | Размер | SHA-256 | Результат | +|---|---:|---|---| +| `tx_abab.cs8` | 21 177 088 байт | `5b34bbe1a8e6d037d2d6d367a74e9eb84e8940db7da61600ffaa7f7497d4f600` | совпал | +| `rx_stream.cs8` | 48 000 000 байт | `e336dd653fa554058052fcf851e9f2462f66b8cf7c710815ca2b9a09ffc23ad4` | совпал | + +Использованы сохранённые RX-start A1/B1/A2/B2: 5 254 791 / 7 709 991 / 10 149 062 / 12 604 263. Исторические файлы Lab054/Lab056 не изменялись. Оборудование не опрашивалось, RF TX = 0. + +## Receiver-like и oracle + +Receiver-like применяет существующие RRC, timing и carrier estimates. Для оценки ему доступны только 1280 символов штатной преамбулы. Полный TX truth подключается затем лишь для подсчёта ошибок. Границы burst унаследованы от Lab056, поэтому независимый поиск пакета здесь не проверяется. + +Oracle использует известный TX для диагностического согласования. 64 временные плитки разделены заранее: чётные оценивают timing/CFO/h, нечётные проверяют результат. По восемь символов с каждой стороны каждой плитки исключены, чтобы опоры RRC и sinc не пересекали train/validation. Постоянная составляющая оценивается только по защищённым чётным участкам raw. Timing выбирается на фиксированной сетке −0,5…+0,5 символа с шагом 1/32. Основные физические метрики относятся к защищённым нечётным плиткам. + +| Сегмент | Режим | Ошибки / символы | BER | CFO, Гц | Timing, символа | RMS EVM | Matched/residual, дБ | +|---|---|---:|---:|---:|---:|---:|---:| +| A1 | receiver-like | 1 / 2816 | 0,0355% | +0,0558 | +0,0050 | 0,3164 | +9,9946 | +| A1 | oracle | 0 / 1536 | 0% | −0,0175 | 0 | 0,3146 | +10,0454 | +| B1 | receiver-like | 53110 / 101120 | 52,5218% | +4,6690 | 0 | 1,6279 | −4,2326 | +| B1 | oracle | 1625 / 50688 | 3,2059% | −0,0617 | −0,03125 | 0,8151 | +1,7761 | +| A2 | receiver-like | 0 / 2816 | 0% | −0,1387 | 0 | 0,3321 | +9,5741 | +| A2 | oracle | 0 / 1536 | 0% | +0,0072 | 0 | 0,3202 | +9,8916 | +| B2 | receiver-like | 52898 / 101120 | 52,3121% | +4,7422 | −0,0625 | 1,6786 | −4,4991 | +| B2 | oracle | 1919 / 50688 | 3,7859% | −0,0187 | −0,03125 | 0,8756 | +1,1536 | + +Средний receiver-like BER A/B равен 0,0178% / 52,4169%; средний oracle BER — 0% / 3,4959%. Разрыв receiver-like–oracle у B около 48,92 процентного пункта. Oracle не является packet PASS и не меняет исторический результат Lab054. + +## Решения, EVM и margin + +Использована модель `r = h*s + e` и формула `EVM_RMS = sqrt(mean(|e|²) / mean(|h*s|²))`. Matched/residual — отношение мощности модельной компоненты к остатку, содержащему шум, ISI и ошибки модели; это не Eb/N0. + +| Метрика oracle | A1 | A2 | A mean | B1 | B2 | B mean | B−A | +|---|---:|---:|---:|---:|---:|---:|---:| +| BER | 0% | 0% | 0% | 3,2059% | 3,7859% | 3,4959% | +3,4959 п.п. | +| RMS EVM | 0,3146 | 0,3202 | 0,3174 | 0,8151 | 0,8756 | 0,8453 | +0,5280 | +| Matched/residual, дБ | 10,0454 | 9,8916 | 9,9685 | 1,7761 | 1,1536 | 1,4648 | −8,5036 | +| Margin median | 1,0278 | 1,0233 | 1,0256 | 1,0383 | 1,0295 | 1,0339 | +0,0084 | +| Margin p10 | 0,8134 | 0,7810 | 0,7972 | 0,4456 | 0,4080 | 0,4268 | −0,3704 | +| Margin p01 | 0,4432 | 0,4030 | 0,4231 | −0,7474 | −0,8916 | −0,8195 | −1,2426 | +| Eye opening | 2,0110 | 1,9848 | 1,9979 | 2,0221 | 1,9648 | 1,9935 | −0,0044 | +| ISI ratio, дБ | −34,4848 | −32,1542 | −33,3195 | −30,2664 | −29,9349 | −30,1006 | +3,2189 | +| H(f) ripple p95−p05, дБ | 0,4274 | 0,3860 | 0,4067 | 4,5321 | 6,4107 | 5,4714 | +5,0647 | + +Центры облаков остаются около ±1, поэтому median margin и среднее eye opening почти одинаковы. У B намного шире хвосты: p01 становится отрицательным, что непосредственно соответствует ошибочным решениям. Разделение центров относительно pooled standard deviation снижается с 12,07σ в среднем у A до 3,65σ у B. + +![Созвездия A/B](../data/processed/lab058/constellation_a_vs_b.png) + +![BER, EVM и matched/residual](../data/processed/lab058/symbol_quality_comparison.png) + +## Eye и чувствительность timing + +Время нормировано в долях символа, поэтому 400 и 16 отсчётов/символ сравниваются в общей шкале. Среднее падение opening при −0,1/+0,1 символа составляет около 1,98%/1,87% у A и 1,72%/1,78% у B. Сильного дополнительного закрытия eye именно от малого timing offset не видно. У B основная проблема проявляется в разбросе точек и фазе, а не в среднем расстоянии между центрами. + +![Eye A](../data/processed/lab058/eye_a.png) + +![Eye B](../data/processed/lab058/eye_b.png) + +## H(f) и диагностический ISI + +H(f) рассчитана как усреднённое `Sxy/Sxx` по Hann-окнам 8192 отсчёта с 50% overlap. Сохранены только bins внутри RRC-полосы и не ниже −20 дБ по TX PSD. У A осталось 27 bins с median coherence 0,903; у B — 516 bins с median coherence 0,551. Робастный p95−p05 amplitude ripple равен 0,407 дБ для A и 5,471 дБ для B. Полный max−min равен 0,791 и 22,962 дБ, но эта крайняя величина чувствительна к отдельным bins, поэтому основным показателем выбран p95−p05. Остаточная phase ripple p95−p05 составляет 0,042 и 0,306 rad. Производная фазы оказалась недостаточно устойчивой по заранее заданному критерию, поэтому variation group delay не объявляется результатом. + +Эти данные показывают широкополосную неравномерность всего OTA-тракта B, но средняя coherence B умеренная и тракт не разделён на TX, propagation и RX. Это свидетельство дополнительного частотно-зависимого эффекта, а не доказательство многолучёвости или аппаратной потери HackRF. + +Фиксированный МНК-отклик −5…+5 символов дал adjacent/main −33,32 дБ у A и −30,10 дБ у B. ISI у B выше на 3,22 дБ, но абсолютная сумма соседних taps остаётся примерно на 30 дБ ниже главного. Большой адаптивный equalizer не применялся. + +![Диагностическая H(f)](../data/processed/lab058/channel_transfer.png) + +![Диагностические ISI taps](../data/processed/lab058/diagnostic_isi.png) + +## Контроли и энергетическое сравнение + +- Сохранённый TX после того же RRC/oracle тракта дал BER 0 для A и B. Остаток цифрового TX-контроля RMS EVM равен 0,01105 / 0,00998; он включает конечные RRC/transient/model effects и не приписывается исключительно int8-квантованию. +- Synthetic AWGN использовал seed 5801, одинаковые Fs, TX RMS и комплексную дисперсию шума 400 код²/отсчёт. BER остался 0, но EVM ухудшился от 0,02503 до 0,11406, то есть на 13,17 дБ; matched/residual снизился с 32,03 до 18,86 дБ. Направление и масштаб совместимы с падением энергии символа −13,870505 дБ. Это контроль формул, не модель, подогнанная к OTA, и не доказательство AWGN-природы реального канала. +- Фоновое окно до ABAB дало receiver-like/oracle BER 50,31% / 50,35% и oracle training coherence `4,50e−5`: оно не выглядит как качественный BPSK. + +В реальной записи ухудшение EVM B/A равно 8,51 дБ, меньше энергетических 13,87 дБ, поскольку A уже имеет собственный остаточный floor. По одной OTA-записи нельзя разложить остаток на шум и искажения единственным способом. + +## Повторяемость и вывод + +A1/A2 устойчивы по главным метрикам: BER 0/0, EVM различается на 0,0056 (0,15 дБ), matched/residual — на 0,15 дБ, eye opening — на 0,114 дБ. Диагностический ISI ratio расходится на 2,33 дБ при малом абсолютном уровне соседних taps. + +B1/B2 повторяют основной эффект: oracle BER 3,2059% / 3,7859%, EVM отличается на 0,0606 (0,62 дБ), matched/residual — на 0,62 дБ, eye opening — на 0,25 дБ, ISI ratio — на 0,331 дБ. Ripple H(f) расходится на 1,88 дБ, что ограничивает точность его единственной OTA-оценки, но оба повтора намного менее плоские, чем A. + +Основная классификация — **MIXED**: + +1. Уменьшение энергии символа совместимо с ухудшением EVM и matched/residual B. +2. В широком B-диапазоне видна дополнительная неравномерность всего OTA-тракта, однако её источник и точная доля не локализованы. +3. Самая большая практическая потеря возникает в текущей carrier synchronization: receiver-like B почти случаен, тогда как oracle B сохраняет BER 3,5%. + +Следующий один этап рекомендуется сделать полностью офлайн: проверить исправленный preamble-only CFO/carrier estimator на сохранённых Lab056 A1/B1/A2/B2, Lab054 и TX/AWGN/background controls, требуя приблизить receiver-like B к oracle без регрессии A и без использования payload truth в оценивателе. Lab059 в этой работе не создаётся. + +Машинные данные: [summary.json](../data/processed/lab058/summary.json), [segment_metrics.csv](../data/processed/lab058/segment_metrics.csv), [channel_response.csv](../data/processed/lab058/channel_response.csv). + +Исторический Lab054 остаётся `NOT_A, 0/16`. RF TX = 0. Lab058 не закоммичена, push не выполнялся. diff --git a/experiments/lab058_abab_symbol_quality.py b/experiments/lab058_abab_symbol_quality.py new file mode 100644 index 0000000..835031e --- /dev/null +++ b/experiments/lab058_abab_symbol_quality.py @@ -0,0 +1,549 @@ +"""Lab058: офлайн-анализ качества BPSK-символов записи Lab056.""" + +from __future__ import annotations + +import csv +import hashlib +import json +from pathlib import Path +import sys + +if __package__ in (None, ""): + sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +import matplotlib.pyplot as plt +import numpy as np +from scipy import signal + +from experiments import lab043_pluto_to_rtlsdr as shaping +from experiments import lab057_symbol_diagnosis as lab057 + + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +RAW = PROJECT_ROOT / "data/raw/lab056" +LAB056 = PROJECT_ROOT / "data/processed/lab056" +OUTPUT = PROJECT_ROOT / "data/processed/lab058" +TX_PATH = RAW / "tx_abab.cs8" +RX_PATH = RAW / "rx_stream.cs8" +TX_SHA256 = "5b34bbe1a8e6d037d2d6d367a74e9eb84e8940db7da61600ffaa7f7497d4f600" +RX_SHA256 = "e336dd653fa554058052fcf851e9f2462f66b8cf7c710815ca2b9a09ffc23ad4" +SAMPLE_RATE = 8_000_000 +CARRIER_HZ = 50_000 +TILE_COUNT = 64 +TIMING_GRID = np.linspace(-0.5, 0.5, 33) +ISI_OFFSETS = np.arange(-5, 6) +AWGN_SEED = 5801 +AWGN_COMPLEX_VARIANCE = 400.0 +EXPECTED_ENERGY_DIFFERENCE_DB = -13.870505 + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for block in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +class Cs8File: + """Read-only interleaved signed-I/Q file.""" + + def __init__(self, path: Path): + self.path = path + self.raw = np.memmap(path, np.int8, mode="r") + if self.raw.size % 2: + raise ValueError(f"Нечётный размер cs8: {path}") + self.size = self.raw.size // 2 + + def read(self, start: int, count: int) -> np.ndarray: + if start < 0 or count < 0 or start + count > self.size: + raise ValueError(f"Окно вне {self.path}: {start}+{count}>{self.size}") + values = self.raw[2 * start:2 * (start + count)] + return values[::2].astype(np.float32) + 1j * values[1::2].astype(np.float32) + + +def expected_symbols(symbol_rate: int) -> np.ndarray: + count = 4096 * (symbol_rate // 20_000) + bits = shaping.pilot_prbs7(count) + if not np.array_equal(bits[:1280], lab057.PREAMBLE): + raise AssertionError("PRBS Lab056 не совпала со штатной преамбулой") + return 2.0 * bits.astype(np.float64) - 1.0 + + +def tile_ids(count: int) -> np.ndarray: + return np.minimum(np.arange(count, dtype=np.int64) * TILE_COUNT // count, TILE_COUNT - 1) + + +def training_mask(count: int) -> np.ndarray: + return tile_ids(count) % 2 == 0 + + +def guarded_tile_masks(count: int, margin_symbols: int = 8) -> tuple[np.ndarray, np.ndarray]: + """Return disjoint even/odd tile interiors outside FIR/interpolation support.""" + train = np.zeros(count, dtype=bool) + validation = np.zeros(count, dtype=bool) + for identifier in range(TILE_COUNT): + low = (identifier * count + TILE_COUNT - 1) // TILE_COUNT + margin_symbols + high = ((identifier + 1) * count + TILE_COUNT - 1) // TILE_COUNT - margin_symbols + if low >= high: + raise ValueError("Плитка слишком коротка для защитного края") + (train if identifier % 2 == 0 else validation)[low:high] = True + return train, validation + + +def oracle_matched_filter(values: np.ndarray, taps: np.ndarray, + symbol_rate: int, symbol_count: int) -> np.ndarray: + """Matched filter whose DC nuisance estimate reads only guarded TRAIN intervals.""" + samples_per_symbol = SAMPLE_RATE // symbol_rate + train, _ = guarded_tile_masks(symbol_count) + centers = (16 + 5) * samples_per_symbol + np.arange(symbol_count) * samples_per_symbol + raw_train = np.zeros(len(values), dtype=bool) + for index in np.flatnonzero(train): + raw_train[centers[index]:centers[index] + samples_per_symbol] = True + dc = np.mean(values[raw_train]) + indexes = np.arange(len(values)) + baseband = (values - dc) * np.exp(-2j * np.pi * CARRIER_HZ * indexes / SAMPLE_RATE) + return signal.oaconvolve(baseband, taps, mode="full") + + +def fit_cfo_gain(samples: np.ndarray, expected: np.ndarray, indexes: np.ndarray, + symbol_rate: int, total_symbol_count: int | None = None) -> tuple[float, complex, float]: + """Fit one CFO and h using only the supplied indexes.""" + corrected_sign = samples * expected + if total_symbol_count is None: + total_symbol_count = len(expected) + identifiers = np.minimum(indexes * TILE_COUNT // total_symbol_count, TILE_COUNT - 1) + block_values, block_times = [], [] + for identifier in np.unique(identifiers): + select = identifiers == identifier + value = np.mean(corrected_sign[select]) + if abs(value) > 0: + block_values.append(value) + block_times.append(float(np.mean((indexes[select] + 0.5) / symbol_rate))) + block_values = np.asarray(block_values) + block_times = np.asarray(block_times) + if len(block_times) == 0: + return 0.0, 0j, 0.0 + phase = np.unwrap(np.angle(block_values)) + weights = np.maximum(abs(block_values), 1e-12) + matrix = np.column_stack((np.ones(len(block_times)), block_times - block_times[0])) + coefficients = np.linalg.lstsq(matrix * weights[:, None], phase * weights, rcond=None)[0] + cfo_hz = float(coefficients[1] / (2 * np.pi)) + times = (indexes + 0.5) / symbol_rate + h = complex(np.mean(corrected_sign * np.exp(-2j * np.pi * cfo_hz * times))) + coherence = float(abs(h) ** 2 / max(float(np.mean(abs(samples) ** 2)), 1e-30)) + return cfo_hz, h, coherence + + +def oracle_estimate(matched: np.ndarray, nominal: int, expected: np.ndarray, + symbol_rate: int) -> dict: + samples_per_symbol = SAMPLE_RATE // symbol_rate + train = np.flatnonzero(guarded_tile_masks(len(expected))[0]) + stride = max(1, len(train) // 8192) + probe = train[::stride] + candidates = [] + for fraction in TIMING_GRID: + positions = nominal + fraction * samples_per_symbol + probe * samples_per_symbol + samples = lab057.interpolate(matched, positions) + cfo_hz, h, coherence = fit_cfo_gain(samples, expected[probe], probe, symbol_rate, + len(expected)) + candidates.append((coherence, float(fraction), cfo_hz, h)) + _, fraction, _, _ = max(candidates, key=lambda row: row[0]) + positions = nominal + fraction * samples_per_symbol + np.arange(len(expected)) * samples_per_symbol + symbols = lab057.interpolate(matched, positions) + train_samples = symbols[train] + cfo_hz, h, coherence = fit_cfo_gain(train_samples, expected[train], train, symbol_rate, + len(expected)) + return {"timing_fraction": fraction, "timing_samples": fraction * samples_per_symbol, + "cfo_hz": cfo_hz, "h": h, "train_coherence": coherence, + "symbols": symbols} + + +def receiver_like(frontend: lab057.Frontend, values: np.ndarray, + expected: np.ndarray) -> dict: + window = frontend.extract(values, len(expected)) + if not window.passed: + raise RuntimeError(f"Штатное извлечение не выполнено: {window.reason}") + matched = frontend.filter(values) + start = frontend.nominal + window.timing_offset_samples + symbols = matched[start:start + len(expected) * frontend.samples_per_symbol: + frontend.samples_per_symbol].astype(np.complex128) + carrier = window.carrier + h = carrier["abs_h"] * np.exp(1j * carrier["phase_rad"]) + return {"timing_fraction": window.timing_offset_samples / frontend.samples_per_symbol, + "timing_samples": float(window.timing_offset_samples), + "cfo_hz": float(carrier["cfo_hz"]), "h": complex(h), + "train_coherence": None, "symbols": symbols, "matched": matched} + + +def evaluate(estimate: dict, expected: np.ndarray, symbol_rate: int, + selected: np.ndarray) -> dict: + indexes = np.flatnonzero(selected) + symbols = estimate["symbols"][selected] + truth = expected[selected] + times = (indexes + 0.5) / symbol_rate + derotated = symbols * np.exp(-2j * np.pi * estimate["cfo_hz"] * times) + h = estimate["h"] + normalized = derotated / h + predicted = h * truth + residual = derotated - predicted + decisions = normalized.real >= 0 + bits = truth > 0 + errors = int(np.count_nonzero(decisions != bits)) + matched_power = float(np.mean(abs(predicted) ** 2)) + residual_power = float(np.mean(abs(residual) ** 2)) + plus, minus = normalized.real[truth > 0], normalized.real[truth < 0] + pooled = float(np.sqrt((np.var(plus) + np.var(minus)) / 2)) + separation = (float("inf") if pooled == 0 else + float((np.mean(plus) - np.mean(minus)) / pooled)) + margin = truth * normalized.real + return {"errors": errors, "symbols": int(len(indexes)), "ber": errors / len(indexes), + "plus_mean": float(np.mean(plus)), "plus_std": float(np.std(plus)), + "minus_mean": float(np.mean(minus)), "minus_std": float(np.std(minus)), + "cloud_separation_sigma": separation, + "evm_rms": float(np.sqrt(residual_power / matched_power)), + "matched_component_power": matched_power, "residual_power": residual_power, + "matched_residual_db": (float("inf") if residual_power == 0 else + float(10 * np.log10(matched_power / residual_power))), + "margin_median": float(np.median(margin)), + "margin_p10": float(np.percentile(margin, 10)), + "margin_p01": float(np.percentile(margin, 1)), + "normalized": normalized, "truth": truth, "indexes": indexes} + + +def eye_metrics(matched: np.ndarray, nominal: int, estimate: dict, expected: np.ndarray, + symbol_rate: int) -> tuple[dict, np.ndarray, np.ndarray]: + samples_per_symbol = SAMPLE_RATE // symbol_rate + valid = np.flatnonzero(guarded_tile_masks(len(expected))[1]) + valid = valid[(valid >= 2) & (valid < len(expected) - 2)] + if len(valid) > 4096: + valid = valid[np.linspace(0, len(valid) - 1, 4096, dtype=int)] + phases = np.linspace(-0.5, 0.5, 41) + openings, traces = [], [] + for phase in phases: + positions = (nominal + (estimate["timing_fraction"] + phase) * samples_per_symbol + + valid * samples_per_symbol) + values = lab057.interpolate(matched, positions) + times = (valid + 0.5 + phase) / symbol_rate + normalized = values * np.exp(-2j * np.pi * estimate["cfo_hz"] * times) / estimate["h"] + truth = expected[valid] + openings.append(float(np.mean(normalized.real[truth > 0]) - + np.mean(normalized.real[truth < 0]))) + traces.append(normalized.real) + openings = np.asarray(openings) + center = int(np.argmin(abs(phases))) + left = int(np.argmin(abs(phases + 0.1))) + right = int(np.argmin(abs(phases - 0.1))) + metrics = {"opening": float(openings[center]), + "opening_at_minus_0p1": float(openings[left]), + "opening_at_plus_0p1": float(openings[right]), + "drop_minus_0p1_percent": float(100 * (1 - openings[left] / openings[center])), + "drop_plus_0p1_percent": float(100 * (1 - openings[right] / openings[center]))} + return metrics, phases, np.asarray(traces).T + + +def isi_metrics(estimate: dict, expected: np.ndarray, symbol_rate: int) -> tuple[dict, np.ndarray]: + indexes = np.arange(5, len(expected) - 5) + train = guarded_tile_masks(len(expected))[0][indexes] + indexes = indexes[train] + if len(indexes) > 50000: + indexes = indexes[np.linspace(0, len(indexes) - 1, 50000, dtype=int)] + times = (indexes + 0.5) / symbol_rate + y = estimate["symbols"][indexes] * np.exp(-2j * np.pi * estimate["cfo_hz"] * times) + matrix = np.column_stack([expected[indexes - offset] for offset in ISI_OFFSETS]) + taps = np.linalg.lstsq(matrix, y, rcond=None)[0] + main = float(abs(taps[5]) ** 2) + adjacent = float(np.sum(abs(np.delete(taps, 5)) ** 2)) + return {"main_tap_power": main, "adjacent_taps_power": adjacent, + "isi_ratio_db": float(10 * np.log10(adjacent / main)), + "offsets": ISI_OFFSETS.tolist(), + "taps": [{"real": float(x.real), "imag": float(x.imag)} for x in taps]}, taps + + +def channel_metrics(tx: np.ndarray, rx: np.ndarray, symbol_rate: int, + cfo_hz: float) -> tuple[dict, dict]: + indexes = np.arange(len(tx)) + carrier = np.exp(-2j * np.pi * CARRIER_HZ * indexes / SAMPLE_RATE) + x = (tx - np.mean(tx)) * carrier + y = (rx - np.mean(rx)) * carrier * np.exp(-2j * np.pi * cfo_hz * indexes / SAMPLE_RATE) + frequency, pxx = signal.welch(x, fs=SAMPLE_RATE, window="hann", nperseg=8192, + noverlap=4096, return_onesided=False) + _, pyy = signal.welch(y, fs=SAMPLE_RATE, window="hann", nperseg=8192, + noverlap=4096, return_onesided=False) + _, pxy = signal.csd(x, y, fs=SAMPLE_RATE, window="hann", nperseg=8192, + noverlap=4096, return_onesided=False) + order = np.argsort(frequency) + frequency, pxx, pyy, pxy = frequency[order], pxx[order], pyy[order], pxy[order] + transfer = pxy / np.maximum(pxx, 1e-30) + coherence = abs(pxy) ** 2 / np.maximum(pxx * pyy, 1e-30) + bandwidth = symbol_rate * (1 + 0.35) / 2 + mask = ((abs(frequency) <= bandwidth) & + (pxx >= np.max(pxx[abs(frequency) <= bandwidth]) * 0.01)) + f, h, coh = frequency[mask], transfer[mask], coherence[mask] + gain_db = 20 * np.log10(np.maximum(abs(h), 1e-30)) + phase = np.unwrap(np.angle(h)) + phase_fit = np.polyfit(f, phase, 1) + phase_residual = phase - np.polyval(phase_fit, f) + group_delay = -np.gradient(phase, f) / (2 * np.pi) + stable = bool(len(f) >= 20 and np.median(coh) >= 0.2) + group_delay_stable = bool(len(f) >= 64 and np.median(coh) >= 0.9) + metrics = {"stable": stable, "bins": int(len(f)), + "median_coherence": float(np.median(coh)), + "amplitude_ripple_p95_p05_db": float(np.percentile(gain_db, 95) - np.percentile(gain_db, 5)), + "max_min_gain_db": float(np.max(gain_db) - np.min(gain_db)), + "gain_slope_db_per_mhz": float(np.polyfit(f / 1e6, gain_db, 1)[0]), + "common_group_delay_seconds": float(-phase_fit[0] / (2 * np.pi)), + "residual_phase_ripple_p95_p05_rad": float(np.percentile(phase_residual, 95) - np.percentile(phase_residual, 5)), + "group_delay_stable": group_delay_stable, + "group_delay_variation_p95_p05_seconds": float(np.percentile(group_delay, 95) - np.percentile(group_delay, 5)) if group_delay_stable else None, + "band_edge_hz": bandwidth, "tx_psd_threshold_db": -20.0} + arrays = {"frequency": f, "gain_db": gain_db, "phase_residual": phase_residual, + "coherence": coh} + return metrics, arrays + + +def serializable(value): + if isinstance(value, dict): + return {key: serializable(item) for key, item in value.items() + if key not in ("matched", "normalized", "truth", "indexes")} + if isinstance(value, list): + return [serializable(item) for item in value] + if isinstance(value, complex): + return {"real": float(value.real), "imag": float(value.imag)} + if isinstance(value, np.generic): + return value.item() + return value + + +def analyze_values(values: np.ndarray, expected: np.ndarray, symbol_rate: int) -> tuple[dict, dict]: + frontend = lab057.Frontend(symbol_rate) + receiver = receiver_like(frontend, values, expected) + receiver_select = np.arange(len(expected)) >= 1280 + receiver_result = evaluate(receiver, expected, symbol_rate, receiver_select) + oracle_matched = oracle_matched_filter(values, frontend.taps, symbol_rate, len(expected)) + oracle = oracle_estimate(oracle_matched, frontend.nominal, expected, symbol_rate) + validation = guarded_tile_masks(len(expected))[1] + oracle_result = evaluate(oracle, expected, symbol_rate, validation) + eye, phases, traces = eye_metrics(oracle_matched, frontend.nominal, oracle, + expected, symbol_rate) + isi, taps = isi_metrics(oracle, expected, symbol_rate) + receiver_public = {key: value for key, value in receiver.items() if key not in ("symbols", "matched")} + oracle_public = {key: value for key, value in oracle.items() if key != "symbols"} + result = {"receiver_like": {**serializable(receiver_public), "metrics": serializable(receiver_result)}, + "oracle": {**serializable(oracle_public), "metrics": serializable(oracle_result), + "eye": eye, "isi": isi}} + working = {"frontend": frontend, "receiver": receiver, "oracle": oracle, + "oracle_matched": oracle_matched, + "receiver_result": receiver_result, "oracle_result": oracle_result, + "eye_phases": phases, "eye_traces": traces, "isi_taps": taps} + return result, working + + +def geometric_db(new: float, old: float) -> float: + return float(20 * np.log10(new / old)) + + +def run_functional_tests() -> None: + """Быстрые проверки формул без raw IQ и оборудования.""" + expected = expected_symbols(20_000) + indexes = np.arange(len(expected)) + h = 0.4 + 0.3j + estimate = {"symbols": h * expected, "h": h, "cfo_hz": 0.0} + metrics = evaluate(estimate, expected, 20_000, np.ones(len(expected), bool)) + if metrics["errors"] != 0 or metrics["evm_rms"] > 1e-12: + raise AssertionError("Точный BPSK control не прошёл") + isi, _ = isi_metrics(estimate, expected, 20_000) + if isi["adjacent_taps_power"] > isi["main_tap_power"] * 1e-20: + raise AssertionError("Точный одно-tap control ошибочно содержит ISI") + + +def make_plots(rows: list[dict], work: dict[str, dict]) -> None: + OUTPUT.mkdir(parents=True, exist_ok=True) + fig, axes = plt.subplots(1, 2, figsize=(11, 4.5)) + for axis, mode in zip(axes, ("A", "B")): + for label in (mode + "1", mode + "2"): + metric = work[label]["oracle_result"] + values, truth = metric["normalized"], metric["truth"] + select = np.linspace(0, len(values) - 1, min(5000, len(values)), dtype=int) + axis.scatter(values.real[select], values.imag[select], s=2, alpha=.2, label=label) + axis.set(title=f"{mode}: oracle, held-out symbols", xlabel="I / h", ylabel="Q / h", xlim=(-4, 4), ylim=(-4, 4)) + axis.grid(True, alpha=.25); axis.legend() + fig.tight_layout(); fig.savefig(OUTPUT / "constellation_a_vs_b.png", dpi=160); plt.close(fig) + + for mode in ("A", "B"): + fig, axis = plt.subplots(figsize=(8, 4.5)) + for label in (mode + "1", mode + "2"): + phases, traces = work[label]["eye_phases"], work[label]["eye_traces"] + select = np.linspace(0, len(traces) - 1, min(180, len(traces)), dtype=int) + axis.plot(phases, traces[select].T, alpha=.05, color="C0" if label.endswith("1") else "C1") + axis.axvline(0, color="black", lw=.8); axis.axhline(0, color="black", lw=.8) + axis.set(title=f"Eye diagram {mode}, oracle alignment", xlabel="Смещение, доли символа", ylabel="Re(r/h)") + axis.grid(True, alpha=.2); fig.tight_layout(); fig.savefig(OUTPUT / f"eye_{mode.lower()}.png", dpi=160); plt.close(fig) + + labels = [row["label"] for row in rows] + figure, axes = plt.subplots(1, 3, figsize=(12, 4)) + axes[0].bar(labels, [100 * row["oracle"]["metrics"]["ber"] for row in rows]); axes[0].set_ylabel("BER, %") + axes[1].bar(labels, [row["oracle"]["metrics"]["evm_rms"] for row in rows]); axes[1].set_ylabel("RMS EVM") + axes[2].bar(labels, [row["oracle"]["metrics"]["matched_residual_db"] for row in rows]); axes[2].set_ylabel("Matched/residual, dB") + for axis in axes: axis.grid(True, axis="y", alpha=.25) + figure.tight_layout(); figure.savefig(OUTPUT / "symbol_quality_comparison.png", dpi=160); plt.close(figure) + + fig, axes = plt.subplots(2, 2, figsize=(12, 7), sharex="col") + for column, mode in enumerate(("A", "B")): + for label in (mode + "1", mode + "2"): + arrays = work[label]["channel_arrays"] + axes[0, column].plot(arrays["frequency"] / 1000, arrays["gain_db"], alpha=.8, label=label) + axes[1, column].plot(arrays["frequency"] / 1000, arrays["phase_residual"], alpha=.8, label=label) + axes[0, column].set(title=f"{mode}: усреднённая H(f)", ylabel="|H(f)|, dB") + axes[1, column].set(xlabel="Частота baseband, кГц", ylabel="Остаточная фаза, rad") + for row in range(2): axes[row, column].grid(True, alpha=.25); axes[row, column].legend() + fig.tight_layout(); fig.savefig(OUTPUT / "channel_transfer.png", dpi=160); plt.close(fig) + + fig, axes = plt.subplots(2, 2, figsize=(10, 7), sharex=True) + for axis, label in zip(axes.flat, labels): + taps = work[label]["isi_taps"] + axis.stem(ISI_OFFSETS, 20 * np.log10(np.maximum(abs(taps / taps[5]), 1e-8)), basefmt=" ") + axis.set(title=label, ylabel="Tap/main, dB"); axis.grid(True, alpha=.25) + axes[1, 0].set_xlabel("Смещение, символы"); axes[1, 1].set_xlabel("Смещение, символы") + fig.tight_layout(); fig.savefig(OUTPUT / "diagnostic_isi.png", dpi=160); plt.close(fig) + + +def main() -> None: + OUTPUT.mkdir(parents=True, exist_ok=True) + metadata = json.loads((RAW / "tx_metadata.json").read_text(encoding="utf-8")) + analysis = json.loads((LAB056 / "rf_analysis.json").read_text(encoding="utf-8")) + integrity = {"tx": {"path": str(TX_PATH.relative_to(PROJECT_ROOT)), "bytes": TX_PATH.stat().st_size, + "sha256": sha256(TX_PATH), "expected_sha256": TX_SHA256}, + "rx": {"path": str(RX_PATH.relative_to(PROJECT_ROOT)), "bytes": RX_PATH.stat().st_size, + "sha256": sha256(RX_PATH), "expected_sha256": RX_SHA256}} + if integrity["tx"]["sha256"] != TX_SHA256 or integrity["rx"]["sha256"] != RX_SHA256: + raise RuntimeError("SHA-256 исходных данных Lab056 не совпал") + tx_file, rx_file = Cs8File(TX_PATH), Cs8File(RX_PATH) + measured = {row["label"]: row for row in analysis["segments"]} + rows, work = [], {} + for segment in metadata["segments"]: + label, rate = segment["label"], segment["symbol_rate"] + expected = expected_symbols(rate) + tx = tx_file.read(segment["start"], segment["samples"]) + rx_start = measured[label]["measurement"]["start"] + rx = rx_file.read(rx_start, segment["samples"]) + result, working = analyze_values(rx, expected, rate) + trim = 21 * (SAMPLE_RATE // rate) + channel, arrays = channel_metrics(tx[trim:-trim], rx[trim:-trim], rate, + result["oracle"]["cfo_hz"]) + result["oracle"]["channel"] = channel + row = {"label": label, "symbol_rate": rate, "samples_per_symbol": SAMPLE_RATE // rate, + "rx_start": rx_start, **result} + rows.append(row); working["channel_arrays"] = arrays; work[label] = working + + controls = {"tx": {}, "awgn": {}} + for rate, label in ((20_000, "A"), (500_000, "B")): + segment = next(item for item in metadata["segments"] if item["label"] == label + "1") + tx = tx_file.read(segment["start"], segment["samples"]) + expected = expected_symbols(rate) + tx_result, _ = analyze_values(tx, expected, rate) + controls["tx"][label] = tx_result + random_generator = np.random.default_rng(AWGN_SEED) + noise = np.sqrt(AWGN_COMPLEX_VARIANCE / 2) * ( + random_generator.normal(size=len(tx)) + 1j * random_generator.normal(size=len(tx))) + awgn_result, _ = analyze_values((tx + noise).astype(np.complex64), expected, rate) + controls["awgn"][label] = awgn_result + controls["awgn"].update({"seed": AWGN_SEED, "complex_noise_variance_per_sample": AWGN_COMPLEX_VARIANCE, + "invariant": "same Fs, TX RMS and sampled complex-noise variance"}) + + background_start = analysis["alignment"]["start"] - metadata["segments"][1]["samples"] - 100_000 + background_values = rx_file.read(background_start, metadata["segments"][1]["samples"]) + background_result, _ = analyze_values(background_values, expected_symbols(500_000), 500_000) + controls["background"] = {"rx_start": background_start, **background_result} + if any(controls["tx"][mode]["oracle"]["metrics"]["ber"] != 0 for mode in ("A", "B")): + raise RuntimeError("TX waveform control BER не равен нулю") + if not (controls["awgn"]["B"]["oracle"]["metrics"]["evm_rms"] > + controls["awgn"]["A"]["oracle"]["metrics"]["evm_rms"]): + raise RuntimeError("AWGN control не показал ожидаемого ухудшения EVM") + background_oracle = controls["background"]["oracle"] + if not (0.4 < background_oracle["metrics"]["ber"] < 0.6 and + background_oracle["train_coherence"] < 0.01): + raise RuntimeError("Background ошибочно выглядит как качественный BPSK") + + def mean_metric(mode: str, path: tuple[str, ...]) -> float: + values = [] + for row in rows: + if row["label"].startswith(mode): + value = row + for key in path: value = value[key] + values.append(value) + return float(np.mean(values)) + + primary_paths = { + "symbol_ber": ("oracle", "metrics", "ber"), "evm_rms": ("oracle", "metrics", "evm_rms"), + "matched_residual_db": ("oracle", "metrics", "matched_residual_db"), + "decision_margin_median": ("oracle", "metrics", "margin_median"), + "eye_opening": ("oracle", "eye", "opening"), "isi_ratio_db": ("oracle", "isi", "isi_ratio_db"), + "channel_ripple_db": ("oracle", "channel", "amplitude_ripple_p95_p05_db")} + comparison = {} + for name, path in primary_paths.items(): + a, b = mean_metric("A", path), mean_metric("B", path) + comparison[name] = {"a_mean": a, "b_mean": b, "b_minus_a": b - a} + repeatability = {} + for mode in ("A", "B"): + first = next(row for row in rows if row["label"] == mode + "1") + second = next(row for row in rows if row["label"] == mode + "2") + repeatability[mode] = {} + for name, path in primary_paths.items(): + one, two = first, second + for key in path: one = one[key]; two = two[key] + entry = {"absolute_second_minus_first": float(two - one), + "relative_second_minus_first": None if one == 0 else float((two - one) / abs(one))} + if name in ("evm_rms", "eye_opening") and one > 0 and two > 0: + entry["difference_db"] = geometric_db(two, one) + elif name == "symbol_ber" and one > 0 and two > 0: + entry["difference_db"] = float(10 * np.log10(two / one)) + elif name.endswith("_db"): + entry["difference_db"] = float(two - one) + else: entry["difference_db"] = None + repeatability[mode][name] = entry + + summary = {"lab": "Lab058", "status": "COMPLETED", "scope": "OFFLINE_SAVED_LAB056_ONLY", + "rf_tx": 0, "hardware_access": 0, "integrity": integrity, + "method": {"tiles": TILE_COUNT, "training_tiles": "even", "validation_tiles": "odd", + "guard_symbols_each_tile_edge": 8, + "oracle_dc_source": "guarded_even_training_raw_intervals_only", + "timing_grid_symbol": TIMING_GRID.tolist(), "isi_offsets": ISI_OFFSETS.tolist()}, + "segments": serializable(rows), "comparison": comparison, + "repeatability": repeatability, "controls": serializable(controls), + "known_energy_per_symbol_difference_db": EXPECTED_ENERGY_DIFFERENCE_DB, + "lab054_historical_result": "NOT_A, 0/16", "lab058_commit": "NOT_PERFORMED", + "push": "NOT_PERFORMED"} + (OUTPUT / "summary.json").write_text(json.dumps(summary, ensure_ascii=False, indent=2, allow_nan=False) + "\n", encoding="utf-8") + + flat_rows = [] + for row in rows: + for mode in ("receiver_like", "oracle"): + metric = row[mode]["metrics"] + flat_rows.append({"label": row["label"], "symbol_rate": row["symbol_rate"], "analysis_mode": mode, + **{key: metric[key] for key in ("errors", "symbols", "ber", "plus_mean", "plus_std", + "minus_mean", "minus_std", "cloud_separation_sigma", "evm_rms", + "matched_component_power", "residual_power", "matched_residual_db", + "margin_median", "margin_p10", "margin_p01")}, + "timing_fraction": row[mode]["timing_fraction"], "cfo_hz": row[mode]["cfo_hz"], + "eye_opening": row.get("oracle", {}).get("eye", {}).get("opening") if mode == "oracle" else None, + "isi_ratio_db": row.get("oracle", {}).get("isi", {}).get("isi_ratio_db") if mode == "oracle" else None, + "channel_ripple_db": row.get("oracle", {}).get("channel", {}).get("amplitude_ripple_p95_p05_db") if mode == "oracle" else None}) + with (OUTPUT / "segment_metrics.csv").open("w", newline="", encoding="utf-8") as stream: + writer = csv.DictWriter(stream, fieldnames=list(flat_rows[0])); writer.writeheader(); writer.writerows(flat_rows) + with (OUTPUT / "channel_response.csv").open("w", newline="", encoding="utf-8") as stream: + writer = csv.writer(stream); writer.writerow(["label", "frequency_hz", "gain_db", "phase_residual_rad", "coherence"]) + for label, item in work.items(): + arrays = item["channel_arrays"] + writer.writerows(zip([label] * len(arrays["frequency"]), arrays["frequency"], arrays["gain_db"], arrays["phase_residual"], arrays["coherence"])) + make_plots(rows, work) + print(json.dumps({"status": summary["status"], "comparison": comparison, + "receiver_ber": {r["label"]: r["receiver_like"]["metrics"]["ber"] for r in rows}, + "oracle_ber": {r["label"]: r["oracle"]["metrics"]["ber"] for r in rows}, + "controls": {"tx_ber": {k: v["oracle"]["metrics"]["ber"] for k, v in controls["tx"].items()}, + "awgn_ber": {k: v["oracle"]["metrics"]["ber"] for k, v in controls["awgn"].items() if isinstance(v, dict)}, + "background_ber": controls["background"]["oracle"]["metrics"]["ber"]}}, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/tests/test_lab058_symbol_quality.py b/tests/test_lab058_symbol_quality.py new file mode 100644 index 0000000..d25b8b2 --- /dev/null +++ b/tests/test_lab058_symbol_quality.py @@ -0,0 +1,100 @@ +"""Быстрые тесты диагностических примитивов Lab058.""" + +from __future__ import annotations + +import numpy as np +import pytest + +from experiments import lab058_abab_symbol_quality as lab058 + + +def test_training_and_validation_tiles_are_disjoint_and_complete(): + for count in (4096, 102400): + train = lab058.training_mask(count) + assert train.dtype == bool and train.size == count + assert np.all((lab058.tile_ids(count)[train] % 2) == 0) + assert np.all((lab058.tile_ids(count)[~train] % 2) == 1) + + +def test_guarded_tiles_are_disjoint_and_exclude_boundaries(): + for count in (4096, 102400): + train, validation = lab058.guarded_tile_masks(count) + assert not np.any(train & validation) + assert train.sum() == validation.sum() == count // 2 - 16 * 32 + + +@pytest.mark.parametrize("symbol_rate", [20_000, 500_000]) +def test_cfo_gain_fit_recovers_known_symbol_model(symbol_rate): + expected = lab058.expected_symbols(symbol_rate)[:4096] + indexes = np.arange(len(expected)) + cfo = 1.75 * symbol_rate / 20_000 + h = .7 - .25j + samples = h * expected * np.exp(2j * np.pi * cfo * (indexes + .5) / symbol_rate) + found_cfo, found_h, coherence = lab058.fit_cfo_gain(samples, expected, indexes, symbol_rate) + assert found_cfo == pytest.approx(cfo, abs=1e-8) + assert found_h == pytest.approx(h, abs=1e-10) + assert coherence == pytest.approx(1.0) + + +def test_cfo_gain_subset_keeps_original_tile_time_axis(): + symbol_rate = 500_000 + full = lab058.expected_symbols(symbol_rate) + indexes = np.flatnonzero(lab058.training_mask(len(full)))[::31] + cfo, h = 3.25, .4 + .2j + samples = h * full[indexes] * np.exp(2j * np.pi * cfo * (indexes + .5) / symbol_rate) + found, gain, _ = lab058.fit_cfo_gain(samples, full[indexes], indexes, symbol_rate, len(full)) + assert found == pytest.approx(cfo, abs=1e-8) + assert gain == pytest.approx(h, abs=1e-9) + + +def test_oracle_estimate_does_not_read_guarded_validation_symbols(): + symbol_rate = 500_000 + expected = lab058.expected_symbols(symbol_rate)[:4096] + samples_per_symbol = lab058.SAMPLE_RATE // symbol_rate + values = lab058.shaping.shape_frame_like_lab042(expected, samples_per_symbol) + values *= np.exp(2j * np.pi * lab058.CARRIER_HZ * np.arange(len(values)) / lab058.SAMPLE_RATE) + changed = values.copy() + validation = np.flatnonzero(lab058.guarded_tile_masks(len(expected))[1]) + centers = 21 * samples_per_symbol + validation * samples_per_symbol + for center in centers: + changed[center:center + samples_per_symbol] += 3 - 2j + frontend = lab058.lab057.Frontend(symbol_rate) + first_matched = lab058.oracle_matched_filter(values, frontend.taps, symbol_rate, len(expected)) + second_matched = lab058.oracle_matched_filter(changed, frontend.taps, symbol_rate, len(expected)) + first = lab058.oracle_estimate(first_matched, frontend.nominal, expected, symbol_rate) + second = lab058.oracle_estimate(second_matched, frontend.nominal, expected, symbol_rate) + assert first["timing_fraction"] == second["timing_fraction"] + assert first["cfo_hz"] == pytest.approx(second["cfo_hz"], abs=1e-5) + assert first["h"] == pytest.approx(second["h"], abs=1e-7) + assert first["train_coherence"] == pytest.approx(second["train_coherence"], abs=1e-8) + + +def test_evm_and_margin_formula_on_exact_symbols(): + expected = lab058.expected_symbols(20_000) + indexes = np.arange(len(expected)) + h = .4 + .3j + estimate = {"symbols": h * expected, "h": h, "cfo_hz": 0.0} + result = lab058.evaluate(estimate, expected, 20_000, np.ones(len(expected), bool)) + assert result["errors"] == 0 and result["ber"] == 0 + assert result["evm_rms"] < 1e-14 + assert result["margin_median"] == pytest.approx(1.0) + + +def test_isi_fit_localizes_single_main_tap(): + expected = lab058.expected_symbols(20_000) + h = .2 - .1j + estimate = {"symbols": h * expected, "h": h, "cfo_hz": 0.0} + result, taps = lab058.isi_metrics(estimate, expected, 20_000) + assert abs(taps[5] - h) < 1e-12 + assert result["adjacent_taps_power"] < result["main_tap_power"] * 1e-20 + + +def test_averaged_transfer_estimate_is_flat_for_flat_synthetic_channel(): + random_generator = np.random.default_rng(5802) + count = 131072 + tx = (random_generator.normal(size=count) + 1j * random_generator.normal(size=count)).astype(np.complex64) + gain = .3 - .2j + result, _ = lab058.channel_metrics(tx, gain * tx, 500_000, 0.0) + assert result["stable"] + assert result["median_coherence"] > .999 + assert result["amplitude_ripple_p95_p05_db"] < .01