From 397cfa61dd9a63ab205daaf47787234b87198ec0 Mon Sep 17 00:00:00 2001 From: sioe Date: Fri, 15 Nov 2024 16:51:37 +0100 Subject: [PATCH] =?UTF-8?q?Auswertung=20Experiment=20Database=20t=C3=BCdde?= =?UTF-8?q?lei=20DBHanlder=20l=C3=A4uft=20gut=20f=C3=BCr=20DIESE=20Datanba?= =?UTF-8?q?nk=20struktur...=20App=20begonnen=20aber=20weit=20entfernt=20vo?= =?UTF-8?q?n=20gutem=20Stand?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Classes/00_signals/Signal.m | 9 +- Classes/04_DSP/Equalizer/EQ.m | 10 +- Classes/04_DSP/Equalizer/Postfilter.m | 60 ++++ Classes/04_DSP/Sequence Detection/MLSE.m | 2 +- Classes/DataBaseHandler/DBHandler.m | 208 +++++++++++--- Datatypes/db_mode.m | 9 + Datatypes/equalizer_structure.m | 11 + Datatypes/isEnumeration.m | 11 + Functions/EQ_structures/duobinary_signaling.m | 13 +- Functions/EQ_structures/duobinary_target.m | 15 +- Functions/EQ_structures/vnle.m | 27 +- .../EQ_structures/vnle_postfilter_mlse.m | 16 +- Functions/{ => Lab_helper}/holdAndShowValue.m | 0 .../{ => Lab_helper}/showCurrentMeasurement.m | 5 +- Functions/{ => Lab_helper}/waitUntilClick.m | 0 .../cbrewer2/cbrewer2.m | 260 ----------------- .../cbrewer2/colorbrewer.mat | Bin 4475 -> 0 bytes .../cbrewer2/requireFEXpackage.m | 194 ------------- .../helper_functions_community/linspecer.m | 261 ------------------ .../Violinplot-Matlab-master/LICENSE | 0 .../Violinplot-Matlab-master/README.md | 0 .../Violinplot-Matlab-master/Violin.m | 0 .../Violinplot-Matlab-master/example.png | Bin .../Violinplot-Matlab-master/example2.png | Bin .../test_cases/testviolinplot.m | 0 .../Violinplot-Matlab-master/violinplot.m | 0 .../autoArrangeFigures.m | 0 .../boundedlines/.gitignore | 0 .../boundedlines/Inpaint_nans/.gitignore | 0 .../demo/html/inpaint_nans_demo.html | 0 .../demo/html/inpaint_nans_demo.png | Bin .../demo/html/inpaint_nans_demo_01.png | Bin .../demo/html/inpaint_nans_demo_02.png | Bin .../demo/html/inpaint_nans_demo_03.png | Bin .../demo/html/inpaint_nans_demo_04.png | Bin .../demo/html/inpaint_nans_demo_05.png | Bin .../demo/html/inpaint_nans_demo_06.png | Bin .../Inpaint_nans/demo/inpaint_nans_demo_old.m | 0 .../Inpaint_nans/doc/Nomination comments.rtf | 0 .../doc/methods_of_inpaint_nans.m | 0 .../boundedlines/Inpaint_nans/garden50.jpg | Bin .../boundedlines/Inpaint_nans/inpaint_nans.m | 0 .../Inpaint_nans/inpaint_nans_bc.m | 0 .../Inpaint_nans/inpaint_nans_demo.m | 0 .../boundedlines/Inpaint_nans/license.txt | 0 .../Inpaint_nans/monet_adresse.jpg | Bin .../Inpaint_nans/test/test_main.m | 0 .../boundedlines/LICENSE.txt | 0 .../boundedlines/README.html | 0 .../boundedlines/README.m | 0 .../boundedlines/README.md | 0 .../boundedlines/boundedline/.gitignore | 0 .../boundedlines/boundedline/boundedline.m | 0 .../boundedlines/boundedline/outlinebounds.m | 0 .../boundedlines/catuneven/.gitignore | 0 .../boundedlines/catuneven/catuneven.m | 0 .../boundedlines/readmeExtras/README_01.png | Bin .../boundedlines/readmeExtras/README_02.png | Bin .../boundedlines/readmeExtras/README_03.png | Bin .../boundedlines/readmeExtras/README_04.png | Bin .../boundedlines/readmeExtras/README_05.png | Bin .../boundedlines/readmeExtras/README_06.png | Bin .../boundedlines/readmeExtras/README_07.png | Bin .../boundedlines/readmeExtras/README_08.png | Bin .../boundedlines/singlepatch/.gitignore | 0 .../boundedlines/singlepatch/singlepatch.m | 0 .../colorspace/colorspace.c | 0 .../colorspace/colorspace.h | 0 .../colorspace/colorspace.m | 0 .../mat2tikz/.gitignore | 0 .../mat2tikz/.travis.yml | 0 .../mat2tikz/AUTHORS.md | 0 .../mat2tikz/CHANGELOG.md | 0 .../mat2tikz/CONTRIBUTING.md | 0 .../mat2tikz/LICENSE.md | 0 .../mat2tikz/README.md | 0 .../mat2tikz/logos/matlab2tikz.svg | 0 .../mat2tikz/matlab2tikz.sublime-project | 0 .../mat2tikz/runtests.sh | 0 .../mat2tikz/src/cleanfigure.m | 0 .../mat2tikz/src/dev/formatWhitespace.m | 0 .../mat2tikz/src/figure2dot.m | 0 .../mat2tikz/src/m2tInputParser.m | 0 .../mat2tikz/src/m2tcustom.m | 0 .../mat2tikz/src/matlab2tikz.m | 0 .../src/private/errorUnknownEnvironment.m | 0 .../mat2tikz/src/private/getEnvironment.m | 0 .../mat2tikz/src/private/guitypes.m | 0 .../mat2tikz/src/private/isAxis3D.m | 0 .../mat2tikz/src/private/isVersionBelow.m | 0 .../mat2tikz/src/private/m2tUpdater.m | 0 .../mat2tikz/src/private/m2tstrjoin.m | 0 .../mat2tikz/src/private/versionArray.m | 0 .../mat2tikz/src/private/versionString.m | 0 .../mat2tikz/test/README.md | 0 .../mat2tikz/test/codeReport.m | 0 .../mat2tikz/test/compareTimings.m | 0 .../mat2tikz/test/examples/example_bar_plot.m | 0 .../mat2tikz/test/examples/example_quivers.m | 0 .../mat2tikz/test/makeLatexReport.m | 0 .../mat2tikz/test/makeTapReport.m | 0 .../mat2tikz/test/makeTravisReport.m | 0 .../mat2tikz/test/output/.gitignore | 0 .../mat2tikz/test/private/OSVersion.m | 0 .../mat2tikz/test/private/StreamMaker.m | 0 .../test/private/VersionControlIdentifier.m | 0 .../mat2tikz/test/private/calculateMD5Hash.m | 0 .../mat2tikz/test/private/cleanFiles.m | 0 .../test/private/countNumberOfErrors.m | 0 .../mat2tikz/test/private/emptyStage.m | 0 .../mat2tikz/test/private/emptyStatus.m | 0 .../mat2tikz/test/private/errorHandler.m | 0 .../mat2tikz/test/private/errorHasOccurred.m | 0 .../test/private/execute_hash_stage.m | 0 .../test/private/execute_plot_stage.m | 0 .../test/private/execute_save_stage.m | 0 .../test/private/execute_tikz_stage.m | 0 .../test/private/execute_type_stage.m | 0 .../mat2tikz/test/private/fillStruct.m | 0 .../mat2tikz/test/private/getEnvironment.m | 0 .../test/private/getStagesFromStatus.m | 0 .../mat2tikz/test/private/hasTestFailed.m | 0 .../mat2tikz/test/private/hashTableName.m | 0 .../test/private/initializeGlobalState.m | 0 .../mat2tikz/test/private/loadHashTable.m | 0 .../mat2tikz/test/private/m2troot.m | 0 .../mat2tikz/test/private/m2tstrjoin.m | 0 .../test/private/restoreGlobalState.m | 0 .../test/private/splitPassFailSkippedTests.m | 0 .../test/private/splitUnreliableTests.m | 0 .../mat2tikz/test/private/testMatlab2tikz.m | 0 .../mat2tikz/test/runMatlab2TikzTests.m | 0 .../mat2tikz/test/saveHashTable.m | 0 .../mat2tikz/test/suites/ACID.MATLAB.8.3.md5 | 0 .../mat2tikz/test/suites/ACID.MATLAB.8.4.md5 | 0 .../test/suites/ACID.Octave.3.8.0.md5 | 0 .../test/suites/ACID.Octave.4.2.0.md5 | 0 .../test/suites/ACID.Octave.4.2.2.md5 | 0 .../mat2tikz/test/suites/ACID.m | 0 .../mat2tikz/test/suites/issues.m | 0 .../test/suites/private/getEnvironment.m | 0 .../mat2tikz/test/suites/private/herrorbar.m | 0 .../test/suites/private/isEnvironment.m | 0 .../mat2tikz/test/suites/private/isMATLAB.m | 0 .../mat2tikz/test/suites/private/isOctave.m | 0 .../test/suites/private/isVersionBelow.m | 0 .../test/suites/private/versionCompare.m | 0 .../mat2tikz/test/suites/testPatches.m | 0 .../mat2tikz/test/suites/testSurfshader.m | 0 .../mat2tikz/test/template/.gitignore | 0 .../mat2tikz/test/template/Makefile | 0 .../mat2tikz/test/template/data/.gitignore | 0 .../test/template/data/converted/Makefile | 0 .../test/template/data/reference/Makefile | 0 .../mat2tikz/test/testGraphical.m | 0 .../mat2tikz/test/testHeadless.m | 0 .../png/nt_.png | Bin .../schemer/.gitattributes | 0 .../schemer/.gitignore | 0 .../schemer/CONTRIBUTING.md | 0 .../schemer/LICENSE | 0 .../schemer/README.md | 0 .../schemer/develop/RGBint2hex.m | 0 .../schemer/develop/annotated_default.png | Bin .../schemer/develop/color2javaRGBint.m | 0 .../schemer/develop/sample.cpp | 0 .../schemer/develop/sample.html | 0 .../schemer/develop/sample.java | 0 .../schemer/develop/sample.m | 0 .../schemer/develop/sample.tlc | 0 .../schemer/develop/sample.v | 0 .../schemer/develop/sample.vhdl | 0 .../schemer/develop/sample.x3d | 0 .../schemer/develop/sample.x3dv | 0 .../schemer/develop/sample.xml | 0 .../schemer/develop/short_sample.m | 0 .../schemer/develop/template_scheme.prf | 0 .../schemer/logo.png | Bin .../schemer/schemer_export.m | 0 .../schemer/schemer_import.m | 0 .../schemer/schemes/.gitattributes | 0 .../schemer/schemes/.gitignore | 0 .../schemer/schemes/CONTRIBUTING.md | 0 .../schemer/schemes/LICENSE | 0 .../schemer/schemes/README.md | 0 .../schemes/SilasColorSchemeForMATLAB.prf | 0 .../schemer/schemes/cobalt.prf | 0 .../schemer/schemes/darkmate.prf | 0 .../schemer/schemes/darksteel.prf | 0 .../schemer/schemes/default.prf | 0 .../schemer/schemes/matrix.prf | 0 .../schemer/schemes/monokai.prf | 0 .../schemer/schemes/oblivion.prf | 0 .../schemer/schemes/screenshots/cobalt.png | Bin .../schemer/schemes/screenshots/darkmate.png | Bin .../schemer/schemes/screenshots/darksteel.png | Bin .../schemer/schemes/screenshots/default.png | Bin .../schemer/schemes/screenshots/matrix.png | Bin .../schemer/schemes/screenshots/monokai.png | Bin .../schemer/schemes/screenshots/oblivion.png | Bin .../schemes/screenshots/solarized-dark.png | Bin .../schemes/screenshots/solarized-light.png | Bin .../schemer/schemes/screenshots/tango.png | Bin .../schemer/schemes/screenshots/vibrant.png | Bin .../schemer/schemes/solarized-dark.prf | 0 .../schemer/schemes/solarized-light.prf | 0 .../schemer/schemes/tango.prf | 0 .../schemer/schemes/vibrant.prf | 0 .../sendolmail.m | 0 {Functions => Libs}/settingsdlg/.gitignore | 0 {Functions => Libs}/settingsdlg/License.txt | 52 ++-- {Functions => Libs}/settingsdlg/README.md | 0 {Functions => Libs}/settingsdlg/Screen.png | Bin {Functions => Libs}/settingsdlg/settingsdlg.m | 0 .../settingsdlg/settingsdlg.odt | Bin .../settingsdlg/settingsdlg.pdf | Bin .../auswertung/analyzeDB.m | 85 ++++++ .../auswertung/auswertungs_app.mlapp | Bin 0 -> 45328 bytes .../auswertung/runDSP.m | 190 ++++++++----- 219 files changed, 584 insertions(+), 854 deletions(-) create mode 100644 Classes/04_DSP/Equalizer/Postfilter.m create mode 100644 Datatypes/db_mode.m create mode 100644 Datatypes/equalizer_structure.m create mode 100644 Datatypes/isEnumeration.m rename Functions/{ => Lab_helper}/holdAndShowValue.m (100%) rename Functions/{ => Lab_helper}/showCurrentMeasurement.m (97%) rename Functions/{ => Lab_helper}/waitUntilClick.m (100%) delete mode 100644 Functions/helper_functions_community/cbrewer2/cbrewer2.m delete mode 100644 Functions/helper_functions_community/cbrewer2/colorbrewer.mat delete mode 100644 Functions/helper_functions_community/cbrewer2/requireFEXpackage.m delete mode 100644 Functions/helper_functions_community/linspecer.m rename {Functions/helper_functions_community => Libs}/Violinplot-Matlab-master/LICENSE (100%) rename {Functions/helper_functions_community => Libs}/Violinplot-Matlab-master/README.md (100%) rename {Functions/helper_functions_community => Libs}/Violinplot-Matlab-master/Violin.m (100%) rename {Functions/helper_functions_community => Libs}/Violinplot-Matlab-master/example.png (100%) rename {Functions/helper_functions_community => Libs}/Violinplot-Matlab-master/example2.png (100%) rename {Functions/helper_functions_community => Libs}/Violinplot-Matlab-master/test_cases/testviolinplot.m (100%) rename {Functions/helper_functions_community => Libs}/Violinplot-Matlab-master/violinplot.m (100%) rename {Functions/helper_functions_community => Libs}/autoArrangeFigures.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.html (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_01.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_02.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_03.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_04.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_05.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_06.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/demo/inpaint_nans_demo_old.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/doc/Nomination comments.rtf (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/doc/methods_of_inpaint_nans.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/garden50.jpg (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/inpaint_nans.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/inpaint_nans_bc.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/inpaint_nans_demo.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/license.txt (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/monet_adresse.jpg (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/Inpaint_nans/test/test_main.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/LICENSE.txt (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/README.html (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/README.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/README.md (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/boundedline/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/boundedline/boundedline.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/boundedline/outlinebounds.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/catuneven/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/catuneven/catuneven.m (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_01.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_02.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_03.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_04.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_05.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_06.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_07.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/readmeExtras/README_08.png (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/singlepatch/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/boundedlines/singlepatch/singlepatch.m (100%) rename {Functions/helper_functions_community => Libs}/colorspace/colorspace.c (100%) rename {Functions/helper_functions_community => Libs}/colorspace/colorspace.h (100%) rename {Functions/helper_functions_community => Libs}/colorspace/colorspace.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/.travis.yml (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/AUTHORS.md (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/CHANGELOG.md (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/CONTRIBUTING.md (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/LICENSE.md (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/README.md (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/logos/matlab2tikz.svg (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/matlab2tikz.sublime-project (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/runtests.sh (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/cleanfigure.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/dev/formatWhitespace.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/figure2dot.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/m2tInputParser.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/m2tcustom.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/matlab2tikz.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/errorUnknownEnvironment.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/getEnvironment.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/guitypes.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/isAxis3D.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/isVersionBelow.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/m2tUpdater.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/m2tstrjoin.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/versionArray.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/src/private/versionString.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/README.md (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/codeReport.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/compareTimings.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/examples/example_bar_plot.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/examples/example_quivers.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/makeLatexReport.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/makeTapReport.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/makeTravisReport.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/output/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/OSVersion.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/StreamMaker.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/VersionControlIdentifier.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/calculateMD5Hash.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/cleanFiles.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/countNumberOfErrors.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/emptyStage.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/emptyStatus.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/errorHandler.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/errorHasOccurred.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/execute_hash_stage.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/execute_plot_stage.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/execute_save_stage.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/execute_tikz_stage.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/execute_type_stage.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/fillStruct.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/getEnvironment.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/getStagesFromStatus.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/hasTestFailed.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/hashTableName.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/initializeGlobalState.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/loadHashTable.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/m2troot.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/m2tstrjoin.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/restoreGlobalState.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/splitPassFailSkippedTests.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/splitUnreliableTests.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/private/testMatlab2tikz.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/runMatlab2TikzTests.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/saveHashTable.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/ACID.MATLAB.8.3.md5 (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/ACID.MATLAB.8.4.md5 (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/ACID.Octave.3.8.0.md5 (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/ACID.Octave.4.2.0.md5 (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/ACID.Octave.4.2.2.md5 (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/ACID.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/issues.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/private/getEnvironment.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/private/herrorbar.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/private/isEnvironment.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/private/isMATLAB.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/private/isOctave.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/private/isVersionBelow.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/private/versionCompare.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/testPatches.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/suites/testSurfshader.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/template/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/template/Makefile (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/template/data/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/template/data/converted/Makefile (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/template/data/reference/Makefile (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/testGraphical.m (100%) rename {Functions/helper_functions_community => Libs}/mat2tikz/test/testHeadless.m (100%) rename {Functions/helper_functions_community => Libs}/png/nt_.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/.gitattributes (100%) rename {Functions/helper_functions_community => Libs}/schemer/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/schemer/CONTRIBUTING.md (100%) rename {Functions/helper_functions_community => Libs}/schemer/LICENSE (100%) rename {Functions/helper_functions_community => Libs}/schemer/README.md (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/RGBint2hex.m (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/annotated_default.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/color2javaRGBint.m (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.cpp (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.html (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.java (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.m (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.tlc (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.v (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.vhdl (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.x3d (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.x3dv (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/sample.xml (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/short_sample.m (100%) rename {Functions/helper_functions_community => Libs}/schemer/develop/template_scheme.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/logo.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemer_export.m (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemer_import.m (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/.gitattributes (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/.gitignore (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/CONTRIBUTING.md (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/LICENSE (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/README.md (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/SilasColorSchemeForMATLAB.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/cobalt.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/darkmate.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/darksteel.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/default.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/matrix.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/monokai.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/oblivion.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/cobalt.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/darkmate.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/darksteel.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/default.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/matrix.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/monokai.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/oblivion.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/solarized-dark.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/solarized-light.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/tango.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/screenshots/vibrant.png (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/solarized-dark.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/solarized-light.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/tango.prf (100%) rename {Functions/helper_functions_community => Libs}/schemer/schemes/vibrant.prf (100%) rename {Functions/helper_functions_community => Libs}/sendolmail.m (100%) rename {Functions => Libs}/settingsdlg/.gitignore (100%) rename {Functions => Libs}/settingsdlg/License.txt (98%) rename {Functions => Libs}/settingsdlg/README.md (100%) rename {Functions => Libs}/settingsdlg/Screen.png (100%) rename {Functions => Libs}/settingsdlg/settingsdlg.m (100%) rename {Functions => Libs}/settingsdlg/settingsdlg.odt (100%) rename {Functions => Libs}/settingsdlg/settingsdlg.pdf (100%) create mode 100644 projects/HighSpeedExperiment_2024/auswertung/analyzeDB.m create mode 100644 projects/HighSpeedExperiment_2024/auswertung/auswertungs_app.mlapp diff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m index 71a387c..676d04a 100644 --- a/Classes/00_signals/Signal.m +++ b/Classes/00_signals/Signal.m @@ -254,7 +254,12 @@ classdef Signal CallingModifier = evalin('caller','obj'); end - CallingModifierStruct = obj.objToStructFilteredRecursive(CallingModifier); + if isa(CallingModifier,"Signal") + CallingModifierStruct = obj.objToStructFilteredRecursive(CallingModifier); + ModifierCopy = {CallingModifierStruct}; + end + + ModifierCopy = {CallingModifier}; SignalType = [string(class(obj))]; TimeStamp = [(datetime('now','TimeZone','local','Format','HH:mm:ss'))]; @@ -263,7 +268,7 @@ classdef Signal Nase = [0]; SignalCopy = obj.signal; ModifierName = class(CallingModifier); - ModifierCopy = {CallingModifierStruct}; + cell = {SignalType , TimeStamp , Length , SignalPower(1) , Nase, SignalCopy, ModifierName, ModifierCopy, Description}; diff --git a/Classes/04_DSP/Equalizer/EQ.m b/Classes/04_DSP/Equalizer/EQ.m index 9f528ab..a03d66b 100644 --- a/Classes/04_DSP/Equalizer/EQ.m +++ b/Classes/04_DSP/Equalizer/EQ.m @@ -1,4 +1,4 @@ -classdef EQ %< handle +classdef EQ < handle %EQ Summary of this class goes here % Detailed explanation goes here @@ -289,9 +289,9 @@ classdef EQ %< handle e_dc = e_dc - obj.DCmu*error; - obj.error_log.e_ffe(cnt,trainloops) = e_ffe; - obj.error_log.e_dfe(cnt,trainloops) = e_dfe; - obj.error_log.e_(cnt,trainloops) = error; + % obj.error_log.e_ffe(cnt,trainloops) = e_ffe; + % obj.error_log.e_dfe(cnt,trainloops) = e_dfe; + % obj.error_log.e_(cnt,trainloops) = error; cnt = cnt+1; if obj.Nb(1) > 0 @@ -460,7 +460,7 @@ classdef EQ %< handle if 1%mu_mat ~= 0 e_dc = e_dc - obj.DCmu*error; - error_log(cnt,dd_loop) = e_dc; + % error_log(cnt,dd_loop) = e_dc; cnt = cnt+1; end diff --git a/Classes/04_DSP/Equalizer/Postfilter.m b/Classes/04_DSP/Equalizer/Postfilter.m new file mode 100644 index 0000000..9f72a58 --- /dev/null +++ b/Classes/04_DSP/Equalizer/Postfilter.m @@ -0,0 +1,60 @@ +classdef Postfilter < handle + %NAME Summary of this class goes here + % Detailed explanation goes here + + properties(Access=public) + ncoeff = 2; + burg_coeff = []; + + end + + methods (Access=public) + function obj = Postfilter(options) + %NAME Construct an instance of this class + % Detailed explanation goes here + + arguments + options.ncoeff double = 2 + end + + % + fn = fieldnames(options); + for n = 1:numel(fn) + try + obj.(fn{n}) = options.(fn{n}); + end + end + + % do more stuff + + end + + function signalclass_out = process(obj,signalclass_in,noiseclass_in) + + obj.burg_coeff = arburg(noiseclass_in.signal,obj.ncoeff); + signalclass_in = signalclass_in.filter(obj.burg_coeff,1); + + % append to logbook + lbdesc = ['Postfilter']; + signalclass_in = signalclass_in.logbookentry(lbdesc); + + % write to output + signalclass_out = signalclass_in; + + end + + function showFilter(obj,noiseclass_in) + + noiseclass_in.spectrum('displayname','Noise PSD shifted to 0dBm','fignum',123,'normalizeTo0dB',1); + + [h,w] = freqz(1,obj.burg_coeff,length(noiseclass_in),"whole",noiseclass_in.fs); + h = h/max(abs(h)); + hold on + w_ = (w - noiseclass_in.fs/2); + plot(w_.*1e-9,20*log10(fftshift(h)),'DisplayName',['Burg Coeffs: ', num2str(obj.burg_coeff), ' ']); + + end + + end + +end diff --git a/Classes/04_DSP/Sequence Detection/MLSE.m b/Classes/04_DSP/Sequence Detection/MLSE.m index aad4134..3a780da 100644 --- a/Classes/04_DSP/Sequence Detection/MLSE.m +++ b/Classes/04_DSP/Sequence Detection/MLSE.m @@ -1,4 +1,4 @@ -classdef MLSE +classdef MLSE < handle %MLSE calculates the most probable sequence for an input signal with given/ known channel impulse response of any length properties(Access=public) diff --git a/Classes/DataBaseHandler/DBHandler.m b/Classes/DataBaseHandler/DBHandler.m index b7c2276..2baaaef 100644 --- a/Classes/DataBaseHandler/DBHandler.m +++ b/Classes/DataBaseHandler/DBHandler.m @@ -38,10 +38,22 @@ classdef DBHandler < handle error('Failed to connect to the database: %s', e.message); end - % Get table names and the first rows of each table to understand the structure - obj.getTableNames(); - obj.getTables(); - obj.getDistinctValues(); + if obj.dbIsHealthy + + obj.refresh(); + + else + error('DB seems to be corrupt') + end + + end + + + function obj = refresh(obj) + % Get table names and the first rows of each table to understand the structure + obj.getTableNames(); + obj.getTables(); + obj.getDistinctValues(); end function obj = getTableNames(obj) @@ -86,10 +98,10 @@ classdef DBHandler < handle obj.distinctValues = struct(); % Iterate over each table in obj.tables - tableNames = fieldnames(obj.tables); + tableNames_ = fieldnames(obj.tables); - for i = 1:numel(tableNames) - tableName = tableNames{i}; + for i = 1:numel(tableNames_) + tableName = tableNames_{i}; % Initialize a sub-struct to store distinct values for each field in the table obj.distinctValues.(tableName) = struct(); @@ -101,10 +113,10 @@ classdef DBHandler < handle for j = 1:numel(fieldNames) fieldName = fieldNames{j}; - % Skip fields ending with '_id' as they don't contain useful distinct values - if endsWith(fieldName, '_id') - continue; - end + % % Skip fields ending with '_id' as they don't contain useful distinct values + % if endsWith(fieldName, '_id') + % continue; + % end % Construct SQL to get distinct values for the current field query = sprintf('SELECT DISTINCT %s FROM %s', fieldName, tableName); @@ -123,17 +135,38 @@ classdef DBHandler < handle obj.distinctValues.(tableName).(fieldName) = distinctValues; catch e - warning('Failed to retrieve distinct values for %s.%s: %s', tableName, fieldName, e.message); + % warning('Failed to retrieve distinct values for %s.%s: %s', tableName, fieldName, e.message); obj.distinctValues.(tableName).(fieldName) = []; end end end - % Display the distinct values (optional, for debugging purposes) - disp('Distinct values for each field:'); - disp(obj.distinctValues); end + function healthyDB = dbIsHealthy(obj) + healthyDB = false; + + num_runs = obj.fetch('SELECT COUNT(*) AS total_runs FROM Runs'); + + num_configs = obj.fetch('SELECT COUNT(*) AS total_configurations FROM Configurations'); + + num_meas = obj.fetch('SELECT COUNT(*) AS total_measurements FROM Measurements'); + + assert((num_runs{1,1}==num_configs{1,1})&&(num_configs{1,1}==num_meas{1,1}),'Different num of entries per table'); + + %Check for any duplicate paths + duplictae_raw = obj.fetch("SELECT COALESCE(Runs.rx_raw_path,'NaN') AS rx_raw_path, COUNT(*) AS occurrences FROM Runs GROUP BY rx_raw_path HAVING COUNT(*) > 1"); + duplictae_sync = obj.fetch("SELECT COALESCE(Runs.rx_sync_path,'NaN') AS rx_sync_path, COUNT(*) AS occurrences FROM Runs GROUP BY rx_sync_path HAVING COUNT(*) > 1"); + + if size(duplictae_raw,2) > 1 + for i = 1:size(duplictae_raw,2)-1 + fprintf('Raw Rx Paths: Found %d duplictaes of %s \n',duplictae_raw.occurrences(i),duplictae_raw.rx_raw_path(i)); + end + end + healthyDB = true; + end + + function lastID = appendToTable(obj, tableName, newRow) % appendToTable Appends a new row to the specified table @@ -241,11 +274,87 @@ classdef DBHandler < handle end end + function addBEREntry(obj, berValue, occurrence, runID, ffe, dfe, mlse, pf, eqType, ffe_order, dfe_order, len_tr, mu_ffe, mu_dfe, mu_dc, comment) + % addBEREntry Adds a BER entry linked to an existing or new Equalizer entry. + % Usage: + % addBEREntry(runID, eq, ffe, dfe, mlse, pf, eqType, ffe_order, dfe_order, len_tr, mu_ffe, mu_dfe, mu_dc, berValue, comment) + + if isempty(pf) + postfilter_taps = []; + else + postfilter_taps = pf.burg_coeff; + end + + % Create equalizer data struct for searching and adding if necessary + equalizerData = struct( ... + 'ffe', jsonencode(ffe), ... + 'dfe', jsonencode(dfe), ... + 'mlse', jsonencode(mlse), ... + 'pf', jsonencode(pf), ... + 'eq_type', string(eqType), ... + 'ffe_order', jsonencode(ffe_order), ... + 'dfe_order', jsonencode(dfe_order), ... + 'postfilter_taps',jsonencode(postfilter_taps),... + 'len_tr', len_tr, ... + 'mu_ffe', jsonencode(mu_ffe), ... + 'mu_dfe', mu_dfe, ... + 'mu_dc', mu_dc, ... + 'comment', comment ... + ); + + % Check if exact Equalizer and BER entries already exist in the DB ... + selectedFields = {'Runs.run_id','BERs.ber_id','Equalizer.eq_id','BERs.ber',['BERs.occurrence' ... + '']}; + filterParams = obj.tables; + filterParams.Equalizer = equalizerData; + [dataTable,sql_query] = obj.queryDB(filterParams, selectedFields); + + % get or insert Equalizer + if ~isempty(dataTable) + % Equalizer entry already exists, use the existing eq_id + cur_eq_id = dataTable.eq_id; + else + % Insert the new Equalizer entry + cur_eq_id = obj.appendToTable('Equalizer', equalizerData); + end + + % skip if already here or insert BER entry + if ~isempty(dataTable) + + % A BER entry with the same eq_id, run_id, and occurrence already exists + existingBERValue = dataTable.ber; + + % Compare the existing BER value with the new BER value + if existingBERValue == berValue + fprintf('The BER entry %.2e || -- eq_id: %d -- run_id: %d -- occurrence: %d already exists. \n',berValue, cur_eq_id, runID, occurrence); + else + fprintf('Already found BER for EQ: %.2e ~= %.2e || -- eq_id: %d -- run_id: %d -- occurrence: %d already exists.\n', berValue, existingBERValue, cur_eq_id, runID, occurrence); + end + + else + + % No such BER entry exists, insert the new BER entry + berData = struct( ... + 'run_id', runID, ... + 'eq_id', cur_eq_id, ... + 'ber', berValue, ... + 'occurrence', occurrence ... + ); + + obj.appendToTable('BERs', berData); + + end + + end + + + + function answer = fetch(obj,query) answer = fetch(obj.conn,query); end - function result = getPathsWithFlexibleFilter(obj, filterParams, selectedFields) + function [result,query] = queryDB(obj, filterParams, selectedFields) % getPathsWithFlexibleFilter Retrieves values from Runs table with flexible filtering % and lets the user select which fields to include in the SELECT statement. % @@ -257,8 +366,9 @@ classdef DBHandler < handle % If left empty, two popup windows will prompt the user for input. % % Outputs: - % rxRawPaths: Cell array of values from the Runs table matching the criteria. - % filteredValues: Table of distinct values for parameters included in filterParams. + % result: table with sql return + % query: this was send to SQL DB + arguments obj filterParams = []; @@ -299,7 +409,7 @@ classdef DBHandler < handle fieldName = fieldParts{2}; if isnumeric(obj.tables.(tableName).(fieldName)) - selectClause = [selectClause, 'COALESCE(', selectedFields{i}, ', -1) AS ', fieldName]; + selectClause = [selectClause, 'COALESCE(', selectedFields{i}, ', ''NaN'') AS ', fieldName]; else selectClause = [selectClause, 'COALESCE(', selectedFields{i}, ', '''') AS ', fieldName]; end @@ -321,10 +431,10 @@ classdef DBHandler < handle % Loop through each table in filterParams filterClauses = []; - tableNames = fieldnames(filterParams); + tableNames_ = fieldnames(filterParams); - for t = 1:numel(tableNames) - tableName = tableNames{t}; + for t = 1:numel(tableNames_) + tableName = tableNames_{t}; tableParams = filterParams.(tableName); % Loop through each parameter in the table @@ -343,12 +453,14 @@ classdef DBHandler < handle elseif isnumeric(value) && isnan(value) % If value is NaN, use IS NULL in SQL filterClause = sprintf('%s IS NULL', fullName); - elseif isnumeric(value) + elseif isnumeric(value) && ~isEnumeration(value) filterClause = sprintf('%s = %f', fullName, value); - elseif islogical(value) || (isnumeric(value) && ismember(value, [0, 1])) + elseif islogical(value) || (isnumeric(value) && ismember(value, [0, 1])) && ~isEnumeration(value) filterClause = sprintf('%s = %d', fullName, value); elseif ischar(value) || isstring(value) - filterClause = sprintf('%s = "%s"', fullName, value); + filterClause = sprintf('%s = ''%s''', fullName, char(value)); %nicht nach string suchen sondern nach chararray -> 'bla' statt "bla" + elseif isEnumeration(value) + filterClause = sprintf('%s = ''%s''', fullName, value); else error('Unsupported data type for field "%s".', fullName); end @@ -376,6 +488,7 @@ classdef DBHandler < handle end + function selectedFields = promptSelectFields(obj) % promptSelectFields Prompts the user to select fields from multiple tables to include in the SELECT statement using settingsdlg. @@ -436,41 +549,67 @@ classdef DBHandler < handle % promptFilterParameters Prompts the user to enter filter parameters using the settingsdlg framework. % Get all possible parameters from all tables (excluding sqlite_sequence) - tableNames = fieldnames(obj.tables); - tableNames = setdiff(tableNames, {'sqlite_sequence'}); % Remove sqlite_sequence + tableNames_ = fieldnames(obj.tables); + tableNames_ = setdiff(tableNames_, {'sqlite_sequence'}); % Remove sqlite_sequence % Prepare the inputs for settingsdlg with sections and separators promptSettings = {}; allFieldsFullName = {}; convertedFieldNames = {}; - for i = 1:numel(tableNames) + for i = 1:numel(tableNames_) % Add a separator for each table section promptSettings{end + 1} = 'separator'; - promptSettings{end + 1} = tableNames{i}; + promptSettings{end + 1} = tableNames_{i}; % Get all fields from the current table - tableFields = fieldnames(obj.tables.(tableNames{i})); + tableFields = fieldnames(obj.tables.(tableNames_{i})); % Prepare each field to be added to the dialog for j = 1:numel(tableFields) fieldName = tableFields{j}; - fullName = sprintf('%s.%s', tableNames{i}, fieldName); + fullName = sprintf('%s.%s', tableNames_{i}, fieldName); convertedName = strrep(fullName, '.', '_'); % Replace '.' with '_' + % Skip fields that do not have distinct values stored + if ~isfield(obj.distinctValues.(tableNames_{i}), fieldName) + continue; + end + + % Get the distinct values for the field + distinctValues_ = obj.distinctValues.(tableNames_{i}).(fieldName); + + % Prepare distinct values for dropdown + if isempty(distinctValues_) + % If there are no distinct values, use only an "All" entry + distinctValues_ = {'All'}; + else + % Ensure distinctValues is a cell array of strings + if isnumeric(distinctValues_) + distinctValues_ = arrayfun(@(x) num2str(x), distinctValues_, 'UniformOutput', false); + elseif isstring(distinctValues_) + distinctValues_ = cellstr(distinctValues_); + elseif iscell(distinctValues_) && ~iscellstr(distinctValues_) + distinctValues_ = cellfun(@num2str, distinctValues_, 'UniformOutput', false); + end + + % Add an "All" option at the beginning of the distinct values list + distinctValues_ = [{'All'}; distinctValues_]; + end + allFieldsFullName{end + 1} = fullName; % Add full name to the list convertedFieldNames{end + 1} = convertedName; % Store the converted name % Add the field name and value setting to the prompt promptSettings{end + 1} = {sprintf('%s', fullName), convertedName}; - promptSettings{end + 1} = []; + promptSettings{end + 1} = distinctValues_; % Add distinct values as dropdown options end end % Create the settings dialog [settings, button] = settingsdlg(... 'title', 'Input Parameters for Filtering', ... - 'description', 'Enter the values for each field to filter. Leave empty to include all values. Type NaN for NULL.', ... + 'description', 'Enter the values for each field to filter. Select "All" to include all values.', ... promptSettings{:} ... ); @@ -497,7 +636,7 @@ classdef DBHandler < handle end % Assign values to the respective fields under each table - if isempty(value) + if strcmp(value, 'All') filterParams.(tableName).(fieldName) = []; % Set to empty to include all values elseif isnumeric(value) && isnan(value) filterParams.(tableName).(fieldName) = NaN; % Use NaN to handle as NULL @@ -510,5 +649,6 @@ classdef DBHandler < handle + end end diff --git a/Datatypes/db_mode.m b/Datatypes/db_mode.m new file mode 100644 index 0000000..9b22523 --- /dev/null +++ b/Datatypes/db_mode.m @@ -0,0 +1,9 @@ +classdef db_mode < int32 + + enumeration + no_db (0) + db_precoded (1) + db_encoded (2) + end + +end \ No newline at end of file diff --git a/Datatypes/equalizer_structure.m b/Datatypes/equalizer_structure.m new file mode 100644 index 0000000..263260b --- /dev/null +++ b/Datatypes/equalizer_structure.m @@ -0,0 +1,11 @@ +classdef equalizer_structure < int32 + + enumeration + ffe (0) + vnle (1) + vnle_pf_mlse (2) + db_precoded (3) + db_encoded (4) + end + +end \ No newline at end of file diff --git a/Datatypes/isEnumeration.m b/Datatypes/isEnumeration.m new file mode 100644 index 0000000..048b851 --- /dev/null +++ b/Datatypes/isEnumeration.m @@ -0,0 +1,11 @@ +function result = isEnumeration(value) + % isEnumeration Checks if a given value is an instance of an enumeration class + % Usage: + % result = isEnumeration(value); + + % Get meta information about the class of the value + metaInfo = metaclass(value); + + % Check if the meta information indicates an enumeration class + result = metaInfo.Enumeration; +end \ No newline at end of file diff --git a/Functions/EQ_structures/duobinary_signaling.m b/Functions/EQ_structures/duobinary_signaling.m index 8fd2f80..3f2e8be 100644 --- a/Functions/EQ_structures/duobinary_signaling.m +++ b/Functions/EQ_structures/duobinary_signaling.m @@ -1,4 +1,15 @@ -function duobinary_signaling() +function [eq_signal,eq_noise,ber,numErrors] = duobinary_signaling(EQ, MLSE,M ,rx_signal, tx_symbols, tx_bits) + %Duobinary Signaling + [eq_signal, eq_noise] = EQ.process(rx_signal,tx_symbols); + + eq_signal = MLSE.process(eq_signal); + + eq_signal = Duobinary().decode(eq_signal); + + % M = numel(unique(eq_signal.signal)); + rx_bits = PAMmapper(M,0).demap(eq_signal); + + [~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); end \ No newline at end of file diff --git a/Functions/EQ_structures/duobinary_target.m b/Functions/EQ_structures/duobinary_target.m index 2a72291..93ad6bf 100644 --- a/Functions/EQ_structures/duobinary_target.m +++ b/Functions/EQ_structures/duobinary_target.m @@ -1,4 +1,17 @@ -function duobinary_target() +function [eq_signal,eq_noise,ber,numErrors] = duobinary_target(EQ, MLSE,M, rx_signal, tx_symbols, tx_bits) + + %Duobinary Targeting + [eq_signal, eq_noise] = EQ.process(rx_signal,Duobinary().encode(tx_symbols)); + % dir = [1,1]; + eq_signal = MLSE.process(eq_signal); + + eq_signal = Duobinary().decode(eq_signal); + + % M = numel(unique(tx_symbols.signal)); + rx_bits = PAMmapper(M,0).demap(eq_signal); + + [~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); + end \ No newline at end of file diff --git a/Functions/EQ_structures/vnle.m b/Functions/EQ_structures/vnle.m index 508b2e3..6b32987 100644 --- a/Functions/EQ_structures/vnle.m +++ b/Functions/EQ_structures/vnle.m @@ -1,4 +1,25 @@ -function eq_signal = vnle(EQ,rx_signal,tx_symbols) - %VNLE - eq_signal = EQ.process(rx_signal,tx_symbols); +function [eq_signal,eq_noise,ber,numErrors] = vnle(EQ,M,rx_signal,tx_symbols,tx_bits) + %VNLE Apply an equalization algorithm to the received signal and calculate BER + % This function takes an equalizer object, a received signal, and the + % transmitted symbols to apply equalization, map the received signal back to bits, + % and compute the bit error rate (BER). + % + % Inputs: + % EQ - Equalizer object that provides the equalization method + % rx_signal - Received signal that needs to be equalized + % tx_symbols - Transmitted symbols used as a reference for BER calculation + % + % Outputs: + % eq_signal - Equalized version of the received signal + % ber - Bit error rate after equalization + % numErrors - Number of bit errors detected + + %FFE or VNLE + [eq_signal,eq_noise] = EQ.process(rx_signal,tx_symbols); + + % M = numel(unique(tx_symbols.signal)); + rx_bits = PAMmapper(M,0).demap(eq_signal); + + [~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); + end \ No newline at end of file diff --git a/Functions/EQ_structures/vnle_postfilter_mlse.m b/Functions/EQ_structures/vnle_postfilter_mlse.m index 3feb3ea..a022b19 100644 --- a/Functions/EQ_structures/vnle_postfilter_mlse.m +++ b/Functions/EQ_structures/vnle_postfilter_mlse.m @@ -1,4 +1,18 @@ -function vnle_postfilter_mlse() +function [eq_signal,eq_noise,ber,numErrors] = vnle_postfilter_mlse(eq_,pf_,mlse_,M,rx_signal,tx_symbols,tx_bits) + + %FFE or VNLE + [eq_signal,eq_noise] = eq_.process(rx_signal,tx_symbols); + eq_signal = pf_.process(eq_signal,eq_noise); + %M = numel(unique(tx_symbols.signal)); + mlse_.DIR = pf_.burg_coeff; + mlse_.trellis_states = PAMmapper(M,0).levels; + mlse_.M = M; + eq_signal = mlse_.process(eq_signal); + + rx_bits = PAMmapper(M,0).demap(eq_signal); + + [~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); + end \ No newline at end of file diff --git a/Functions/holdAndShowValue.m b/Functions/Lab_helper/holdAndShowValue.m similarity index 100% rename from Functions/holdAndShowValue.m rename to Functions/Lab_helper/holdAndShowValue.m diff --git a/Functions/showCurrentMeasurement.m b/Functions/Lab_helper/showCurrentMeasurement.m similarity index 97% rename from Functions/showCurrentMeasurement.m rename to Functions/Lab_helper/showCurrentMeasurement.m index dc316f6..fb08670 100644 --- a/Functions/showCurrentMeasurement.m +++ b/Functions/Lab_helper/showCurrentMeasurement.m @@ -1,5 +1,8 @@ function showCurrentMeasurement(varargin) - % showCurrentMeasurement displays measurement data in a figure with variable names + + % USEFUL FOR LAB! + + % showCurrentMeasurement displays lab measurement data in a table figure with variable names % as column headers and values listed below. Calling the function multiple times % with the same variable names but different values adds more data points. % diff --git a/Functions/waitUntilClick.m b/Functions/Lab_helper/waitUntilClick.m similarity index 100% rename from Functions/waitUntilClick.m rename to Functions/Lab_helper/waitUntilClick.m diff --git a/Functions/helper_functions_community/cbrewer2/cbrewer2.m b/Functions/helper_functions_community/cbrewer2/cbrewer2.m deleted file mode 100644 index dcdc2ec..0000000 --- a/Functions/helper_functions_community/cbrewer2/cbrewer2.m +++ /dev/null @@ -1,260 +0,0 @@ -%CBREWER2 Interpolated versions of Cynthia Brewer's ColorBrewer colormaps -% CBREWER2(CNAME, NCOL) returns the colour scheme CNAME with the number -% of colours equal to NCOL. If there is a ColorBrewer scheme with exactly -% this number of colours, the color scheme is returned as-is. If NCOL -% larger (or smaller) than the designed colormaps for this scheme, the -% largest (smallest) one is interpolated to provide enough colours, -% unless the requested colour scheme CNAME is a qualitative palette. For -% a qualitative scheme, the colours are repeated, cycling from the -% beginning again, to output the requested NCOL colours. -% -% CBREWER2(CNAME) without an NCOL input will use the same number of -% colours as the current colormap. -% -% CBREWER2(CNAME, NCOL, INTERP_METHOD) allows you to change the method -% used for the interpolation. The default is 'cubic'. -% -% CBREWER2(CNAME, NCOL, INTERP_METHOD, INTERP_SPACE) allows you to -% change the colorspace used for the interpolation. By default, this is -% in the CIELAB colorspace, which is approximately perceptually uniform. -% Options for INTERP_SPACE are -% 'rgb' : interpolation in sRGB (as used in original CBREWER) -% 'lab' : interpolation in CIELAB (default) -% 'lch' : interpolation in CIELCH_ab (not recommended due to the -% discontinuities at C=0 and H=0) -% Anything else supported by COLORSPACE will also function. -% -% The input format CBREWER2(TYPE, ...) can also be used, where TYPE is -% one of 'seq', 'div', 'qual'. This input is redandant and will be -% ignored. This input format is provided for backwards compatibility with -% the original CBREWER. -% -% Example 1 (sequential heatmap): -% C = [0 2 4 6; 8 10 12 14; 16 18 20 22]; -% imagesc(C); -% colorbar; -% colormap(cbrewer('YlOrRd', 256); -% -% Example 2 (line plot): -% x = 0:0.01:2; -% sc = [0.5; 1; 2]; -% t0 = [0; 0.2; 0.4]; -% t = bsxfun(@rdivide, bsxfun(@plus, x, t0), sc); -% y = sin(t * 2 * pi); -% cmap = cbrewer2('Set1', numel(sc)); -% axes('ColorOrder', cmap, 'NextPlot', 'ReplaceChildren'); -% plot(x, y); -% -% Example 3 (divergent heatmap): -% [X,Y,Z] = peaks(30); -% surfc(X,Y,Z); -% colormap(cbrewer2('RdBu')); -% -% This product includes color specifications and designs developed by -% Cynthia Brewer (http://colorbrewer.org/). For more information on -% ColorBrewer, please visit http://colorbrewer.org/. -% -% CBREWER2 uses a cached copy of the Cynthia Brewer color schemes which -% was converted to .mat format by Charles Robert for use with CBREWER. -% CBREWER is available from the MATLAB FileExchange under the MIT license. -% -% See also CBREWER, BREWERMAP, COLORSPACE, INTERP1. - - -% Copyright (c) 2016 Scott Lowe -% -% Licensed under the Apache License, Version 2.0 (the "License"); -% you may not use this file except in compliance with the License. -% You may obtain a copy of the License at -% -% http://www.apache.org/licenses/LICENSE-2.0 -% -% Unless required by applicable law or agreed to in writing, software -% distributed under the License is distributed on an "AS IS" BASIS, -% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -% See the License for the specific language governing permissions and -% limitations under the License. - - -function colormap = cbrewer2(... - cname, ncol, interp_method, interp_space, varargin) - -% Definitions ------------------------------------------------------------- - -% List of all of Cynthia Brewer's colormaps and their types -% seq: sequential -% div: divergent -% qual: qualitative -cbdict = {... - 'Blues', 'seq'; ... - 'BuGn', 'seq'; ... - 'BuPu', 'seq'; ... - 'GnBu', 'seq'; ... - 'Greens', 'seq'; ... - 'Greys', 'seq'; ... - 'Oranges', 'seq'; ... - 'OrRd', 'seq'; ... - 'PuBu', 'seq'; ... - 'PuBuGn', 'seq'; ... - 'PuRd', 'seq'; ... - 'Purples', 'seq'; ... - 'RdPu', 'seq'; ... - 'Reds', 'seq'; ... - 'YlGn', 'seq'; ... - 'YlGnBu', 'seq'; ... - 'YlOrBr', 'seq'; ... - 'YlOrRd', 'seq'; ... - 'BrBG', 'div'; ... - 'PiYG', 'div'; ... - 'PRGn', 'div'; ... - 'PuOr', 'div'; ... - 'RdBu', 'div'; ... - 'RdGy', 'div'; ... - 'RdYlBu', 'div'; ... - 'RdYlGn', 'div'; ... - 'Spectral', 'div'; ... - 'Accent', 'qual'; ... - 'Dark2', 'qual'; ... - 'Paired', 'qual'; ... - 'Pastel1', 'qual'; ... - 'Pastel2', 'qual'; ... - 'Set1', 'qual'; ... - 'Set2', 'qual'; ... - 'Set3', 'qual'; ... - }; - - -% Input handling ---------------------------------------------------------- - -narginchk(1, 5); - -% Initialise variables if not supplied -if nargin<2 - ncol = []; -end -if nargin<3 - interp_method = []; -end -if nargin<4 - interp_space = []; -end -if nargin<5 - varargin = {[]}; -end - -% Check if the colormap type was unnecessarily input -types = unique(cbdict(:, 2)); -if nargin > 1 && ischar(cname) && ischar(ncol) - LI = ismember({cname ncol}, types); - if ~any(LI); error('Number of colors cannot be a string'); end; - if all(LI); error('Incorrect colormap name'); end; - if LI(1) - vgn = {cname; ncol; interp_method; interp_space}; - cname = vgn{2}; - ncol = vgn{3}; - interp_method = vgn{4}; - interp_space = varargin{1}; - ctype_input = vgn{1}; - elseif LI(2) - vgn = {cname; ncol; interp_method; interp_space}; - cname = vgn{1}; - ncol = vgn{3}; - interp_method = vgn{4}; - interp_space = varargin{1}; - ctype_input = vgn{2}; - end -else - ctype_input = ''; -end - -% Default values -if isempty(ncol) - % Number of colours in the colormap - ncol = size(get(gcf,'colormap'), 1); -end -if isempty(interp_method) - interp_method = 'pchip'; -end -if isempty(interp_space) - interp_space = 'lab'; -end - - -% Load colorbrewer data --------------------------------------------------- -Tmp = load('colorbrewer.mat'); -colorbrewer = Tmp.colorbrewer; - -[TF, idict] = ismember(lower(cname), lower(cbdict(:, 1))); - -if ~TF - error('%s is not a recognised Brewer colormap',cname); -end - -cname = cbdict{idict, 1}; -ctype = cbdict{idict, 2}; - -if (~isfield(colorbrewer.(ctype), cname)) - error('Colormap %s is not present in loaded data',cname); -end - - -% Main script ------------------------------------------------------------- - -if ncol > length(colorbrewer.(ctype).(cname)) - % If we specified too many colours, we take the maximum and interpolate - colormap = colorbrewer.(ctype).(cname){length(colorbrewer.(ctype).(cname))}; - colormap = colormap ./ 255; -elseif isempty(colorbrewer.(ctype).(cname){ncol}) - % If we specified too few colours, we take the minimum and interpolate - nmin = find(~cellfun(@isempty, colorbrewer.(ctype).(cname)), 1); - colormap = colorbrewer.(ctype).(cname){nmin}; - colormap = colormap./255; -else - % If we specified a number of colours in the pre-designed range, no - % need to interpolate - colormap = (colorbrewer.(ctype).(cname){ncol}) ./ 255; - return; -end - -% Don't interpolate if qualitative type -if strcmp(ctype,'qual') - if size(colormap, 1) >= ncol - colormap = colormap(1:ncol, :); - return; - end - warning('CBREWER2:QualTooManyColors', ... - ['Too many colors requested: cannot interpolate a qualitative' ... - ' colorscheme']); - % Cycle the colours from the beginning again, so we have enough to - % return - colormap = repmat(colormap, ceil(ncol / size(colormap, 1)), 1); - colormap = colormap(1:ncol, :); - return; -end - -% Make sure we have colorspace downloaded from the FEX -if ~strcmpi(interp_space, 'rgb') && ~exist('colorspace.m', 'file') - P = requireFEXpackage(28790); - if isempty(P); - error(... - ['You need to download COLORSPACE from the MATLAB FEX and' ... - ' add it to the MATLAB path.']); - end; -end - -% Move to perceptually uniform space -if ~strcmpi(interp_space,'rgb') - colormap = colorspace(['rgb->' interp_space], colormap); -end - -% Linearly interpolate -X = linspace(0, 1, size(colormap, 1)); -XI = linspace(0, 1, ncol); -colormap = interp1(X, colormap, XI, interp_method); - -% Move from perceptually uniform space back to sRGB -if ~strcmpi(interp_space,'rgb') - colormap = colorspace(['rgb<-' interp_space], colormap); -end - -end \ No newline at end of file diff --git a/Functions/helper_functions_community/cbrewer2/colorbrewer.mat b/Functions/helper_functions_community/cbrewer2/colorbrewer.mat deleted file mode 100644 index ec59ef47624450f36bf71566afd6fa552df80ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4475 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 diff --git a/Functions/helper_functions_community/cbrewer2/requireFEXpackage.m b/Functions/helper_functions_community/cbrewer2/requireFEXpackage.m deleted file mode 100644 index 86838cc..0000000 --- a/Functions/helper_functions_community/cbrewer2/requireFEXpackage.m +++ /dev/null @@ -1,194 +0,0 @@ -function AddedPath = requireFEXpackage(FEXSubmissionID) -%Function requireFEXpackage - -%installs Matlab Central File Exchange (FEX) submission -%with given ID into the directory chosen by the user. -%A new FEX submissions may use previous FEX submissions as its part. -%The function 'requireFEXpackage' helps in adding those previous -%submissions to the user's MATLAB installation. -% -%This function is a part of File Exchange submission 31069. -%Download the entire submission: -%http://www.mathworks.com/matlabcentral/fileexchange/31069 -% -% SYNTAX: -% AddedPath = requireFEXpackage(FEXSubmissionID) -% -% INPUT: -% ID of the required submission to File Exchange -% -% OUTPUT: -% the path to that submission added to the user's MATLAB path. -% -% HOW TO CALL: -% The command -% P = requireFEXpackage(8277) -% will download and install the package with ID 8277 -% (namely, nice 'fminsearchbnd' by John D'Errico) -% -% EXAMPLES -- HOW TO USE: -% -% EXAMPLE 1 (using 'exist' command): -% -% % first, somewhere in the very beginning of your code, -% % check if the function 'fminsearchbnd' from the FEX package 8277 -% % is on your MATLAB path, and if it is not there, -% % require the FEX package 8277: -% if ~(exist('fminsearchbnd', 'file') == 2) -% P = requireFEXpackage(8277); % fminsearchbnd is part of 8277 -% end -% -% % Then just use 'fminsearchbnd' where you need it: -% syms x -% RosenbrockBananaFunction = @(x) (1-x(1)).^2 + 100*(x(2)-x(1).^2).^2; -% x = fminsearchbnd(RosenbrockBananaFunction,[3 3]) - -% EXAMPLE 2 (using 'try-catch' command): -% -% syms x -% RosenbrockBananaFunction = @(x) (1-x(1)).^2+100*(x(2)-x(1).^2).^2; -% try -% % if function 'fminsearchbnd' already exists in your MATLAB -% % installation, just use it: -% x = fminsearchbnd(RosenbrockBananaFunction,[3 3]) -% catch -% % if function 'fminsearchbnd' is not present in your MATLAB -% % installation, first get the package 8277 (to which it belongs) -% % from the MATLAB Central File Exchange (FEX) -% P = requireFEXpackage(8277); % fminsearchbnd is part of 8277 -% % and then use that function: -% x = fminsearchbnd(RosenbrockBananaFunction,[3 3]) -% end -% -% -% NOTE: on Mac platform, the title of the dialog box for -% choosing the directory for installing the required FEX package -% is not shown; this is not a bug, this is how UIGETDIR works on Macs -- -% see the documentation for UIGETDIR -% http://www.mathworks.com/help/techdoc/ref/uigetdir.html -% -% (C) Igor Podlubny, 2011 - -% Copyright (c) 2011, Igor Podlubny -% All rights reserved. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are -% met: -% -% * Redistributions of source code must retain the above copyright -% notice, this list of conditions and the following disclaimer. -% * Redistributions in binary form must reproduce the above copyright -% notice, this list of conditions and the following disclaimer in -% the documentation and/or other materials provided with the distribution -% -% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% POSSIBILITY OF SUCH DAMAGE. - - -ID = num2str(FEXSubmissionID); - -% Ask user for the confirmation of the installation -% of the required FEX package -yes = ['YES, Install package ' ID]; -no = 'NO, do not install'; -userchoice = questdlg(['The Matlab function/toolbox, which you are running, ' ... - 'requires the presence of the package ' ID ... - ' from Matlab Central File Exchange.' ... - sprintf('\n\n') ... - 'Would you like to install the FEX package ' ID ' now?'] , ... - ['Required package ' ID], ... - yes, no, yes); - -% Handle response -switch userchoice - case yes, - install = 1; - case no, - install = 0; - otherwise, - install = 0; -end - - -if install == 1 - baseURL = 'http://www.mathworks.com/matlabcentral/fileexchange/'; - query = '?download=true'; - - location = uigetdir(pwd, ['Select the directory for installing the required FEX package' ID ]); - if location ~= 0 - % download package 'ID' from Matlab Central File Exchange - filetosave = [location filesep ID '.zip']; - FEXpackage = [baseURL ID query]; - [f,status] = urlwrite(FEXpackage,filetosave); - if status==0 - warndlg(['No connection to Matlab Central File Exchange,' ' or package ' ID ' does not exist.' ... - ' Package ' ID ' has not been installed. ' ... - ' Check you internet settings and the ID of the required package, and try again. '] , ... - ['No connection to Matlab Central File Exchange' ' or package ' ID ' does not exist'], ... - 'modal'); - AddedPath = ''; - return - end - % unzip the downloaded file to the subdirectory 'ID' - todir = [location filesep ID]; - % if the directory 'ID' doesn't exist at given location, create it - if ~(exist([location filesep ID], 'dir') == 7) - mkdir(location, ID); - end - try - unzip(filetosave, todir); - % after unzipping, delete the downloaded ZIP file - delete(filetosave); - % prepend the paths to the downloaded package to the MATLAB path - P = genpath([location filesep ID]); - path(P,path); - catch - % if the FEX package is not ZIP, then it is a single m-file - % just move the file to the ID directory - [pathstr, name, ext] = fileparts(filetosave); - movefile(filetosave, [todir filesep name '.m']); - P = genpath([location filesep ID]); - path(P,path); - end - else - P = ''; - end - - AddedPath = P; -else - AddedPath = ''; -end - - -if install == 1, - % Ask user about reviewing and saving the modified MATLAB path, - % and take him to PATHTOOL, if the user wants to save the modified path - yes = 'YES, I want to review and save the MATLAB path'; - no = 'NO, I don''t want to save the path permanently'; - userchoice = questdlg(['After adding the package ' ID ... - ' from Matlab Central File Exchange to your MATLAB installation,' ... - ' the MATLAB path has been modified accordingly. ', ... - 'Would you like to review and save the modified MATLAB path?'] , ... - 'Review and save the modified MATLAB path for future use?', ... - yes, no, yes); - - % Handle response - switch userchoice - case yes, - pathtool; - case no, - otherwise, - end -end - - - diff --git a/Functions/helper_functions_community/linspecer.m b/Functions/helper_functions_community/linspecer.m deleted file mode 100644 index 31c5e6e..0000000 --- a/Functions/helper_functions_community/linspecer.m +++ /dev/null @@ -1,261 +0,0 @@ -% function lineStyles = linspecer(N) -% This function creates an Nx3 array of N [R B G] colors -% These can be used to plot lots of lines with distinguishable and nice -% looking colors. -% -% lineStyles = linspecer(N); makes N colors for you to use: lineStyles(ii,:) -% -% colormap(linspecer); set your colormap to have easily distinguishable -% colors and a pleasing aesthetic -% -% lineStyles = linspecer(N,'qualitative'); forces the colors to all be distinguishable (up to 12) -% lineStyles = linspecer(N,'sequential'); forces the colors to vary along a spectrum -% -% % Examples demonstrating the colors. -% -% LINE COLORS -% N=6; -% X = linspace(0,pi*3,1000); -% Y = bsxfun(@(x,n)sin(x+2*n*pi/N), X.', 1:N); -% C = linspecer(N); -% axes('NextPlot','replacechildren', 'ColorOrder',C); -% plot(X,Y,'linewidth',5) -% ylim([-1.1 1.1]); -% -% SIMPLER LINE COLOR EXAMPLE -% N = 6; X = linspace(0,pi*3,1000); -% C = linspecer(N) -% hold off; -% for ii=1:N -% Y = sin(X+2*ii*pi/N); -% plot(X,Y,'color',C(ii,:),'linewidth',3); -% hold on; -% end -% -% COLORMAP EXAMPLE -% A = rand(15); -% figure; imagesc(A); % default colormap -% figure; imagesc(A); colormap(linspecer); % linspecer colormap -% -% See also NDHIST, NHIST, PLOT, COLORMAP, 43700-cubehelix-colormaps -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% by Jonathan Lansey, March 2009-2013 – Lansey at gmail.com % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -%% credits and where the function came from -% The colors are largely taken from: -% http://colorbrewer2.org and Cynthia Brewer, Mark Harrower and The Pennsylvania State University -% -% -% She studied this from a phsychometric perspective and crafted the colors -% beautifully. -% -% I made choices from the many there to decide the nicest once for plotting -% lines in Matlab. I also made a small change to one of the colors I -% thought was a bit too bright. In addition some interpolation is going on -% for the sequential line styles. -% -% -%% - -function lineStyles=linspecer(N,varargin) - -if nargin==0 % return a colormap - lineStyles = linspecer(128); - return; -end - -if ischar(N) - lineStyles = linspecer(128,N); - return; -end - -if N<=0 % its empty, nothing else to do here - lineStyles=[]; - return; -end - -% interperet varagin -qualFlag = 0; -colorblindFlag = 0; - -if ~isempty(varargin)>0 % you set a parameter? - switch lower(varargin{1}) - case {'qualitative','qua'} - if N>12 % go home, you just can't get this. - warning('qualitiative is not possible for greater than 12 items, please reconsider'); - else - if N>9 - warning(['Default may be nicer for ' num2str(N) ' for clearer colors use: whitebg(''black''); ']); - end - end - qualFlag = 1; - case {'sequential','seq'} - lineStyles = colorm(N); - return; - case {'white','whitefade'} - lineStyles = whiteFade(N);return; - case 'red' - lineStyles = whiteFade(N,'red');return; - case 'blue' - lineStyles = whiteFade(N,'blue');return; - case 'green' - lineStyles = whiteFade(N,'green');return; - case {'gray','grey'} - lineStyles = whiteFade(N,'gray');return; - case {'colorblind'} - colorblindFlag = 1; - otherwise - warning(['parameter ''' varargin{1} ''' not recognized']); - end -end -% *.95 -% predefine some colormaps - set3 = colorBrew2mat({[141, 211, 199];[ 255, 237, 111];[ 190, 186, 218];[ 251, 128, 114];[ 128, 177, 211];[ 253, 180, 98];[ 179, 222, 105];[ 188, 128, 189];[ 217, 217, 217];[ 204, 235, 197];[ 252, 205, 229];[ 255, 255, 179]}'); -set1JL = brighten(colorBrew2mat({[228, 26, 28];[ 55, 126, 184]; [ 77, 175, 74];[ 255, 127, 0];[ 255, 237, 111]*.85;[ 166, 86, 40];[ 247, 129, 191];[ 153, 153, 153];[ 152, 78, 163]}')); -set1 = brighten(colorBrew2mat({[ 55, 126, 184]*.85;[228, 26, 28];[ 77, 175, 74];[ 255, 127, 0];[ 152, 78, 163]}),.8); - -% colorblindSet = {[215,25,28];[253,174,97];[171,217,233];[44,123,182]}; -colorblindSet = {[215,25,28];[253,174,97];[171,217,233]*.8;[44,123,182]*.8}; - -set3 = dim(set3,.93); - -if colorblindFlag - switch N - % sorry about this line folks. kind of legacy here because I used to - % use individual 1x3 cells instead of nx3 arrays - case 4 - lineStyles = colorBrew2mat(colorblindSet); - otherwise - colorblindFlag = false; - warning('sorry unsupported colorblind set for this number, using regular types'); - end -end -if ~colorblindFlag - switch N - case 1 - lineStyles = { [ 55, 126, 184]/255}; - case {2, 3, 4, 5 } - lineStyles = set1(1:N); - case {6 , 7, 8, 9} - lineStyles = set1JL(1:N)'; - case {10, 11, 12} - if qualFlag % force qualitative graphs - lineStyles = set3(1:N)'; - else % 10 is a good number to start with the sequential ones. - lineStyles = cmap2linspecer(colorm(N)); - end - otherwise % any old case where I need a quick job done. - lineStyles = cmap2linspecer(colorm(N)); - end -end -lineStyles = cell2mat(lineStyles); - -end - -% extra functions -function varIn = colorBrew2mat(varIn) -for ii=1:length(varIn) % just divide by 255 - varIn{ii}=varIn{ii}/255; -end -end - -function varIn = brighten(varIn,varargin) % increase the brightness - -if isempty(varargin), - frac = .9; -else - frac = varargin{1}; -end - -for ii=1:length(varIn) - varIn{ii}=varIn{ii}*frac+(1-frac); -end -end - -function varIn = dim(varIn,f) - for ii=1:length(varIn) - varIn{ii} = f*varIn{ii}; - end -end - -function vOut = cmap2linspecer(vIn) % changes the format from a double array to a cell array with the right format -vOut = cell(size(vIn,1),1); -for ii=1:size(vIn,1) - vOut{ii} = vIn(ii,:); -end -end -%% -% colorm returns a colormap which is really good for creating informative -% heatmap style figures. -% No particular color stands out and it doesn't do too badly for colorblind people either. -% It works by interpolating the data from the -% 'spectral' setting on http://colorbrewer2.org/ set to 11 colors -% It is modified a little to make the brightest yellow a little less bright. -function cmap = colorm(varargin) -n = 100; -if ~isempty(varargin) - n = varargin{1}; -end - -if n==1 - cmap = [0.2005 0.5593 0.7380]; - return; -end -if n==2 - cmap = [0.2005 0.5593 0.7380; - 0.9684 0.4799 0.2723]; - return; -end - -frac=.95; % Slight modification from colorbrewer here to make the yellows in the center just a bit darker -cmapp = [158, 1, 66; 213, 62, 79; 244, 109, 67; 253, 174, 97; 254, 224, 139; 255*frac, 255*frac, 191*frac; 230, 245, 152; 171, 221, 164; 102, 194, 165; 50, 136, 189; 94, 79, 162]; -x = linspace(1,n,size(cmapp,1)); -xi = 1:n; -cmap = zeros(n,3); -for ii=1:3 - cmap(:,ii) = pchip(x,cmapp(:,ii),xi); -end -cmap = flipud(cmap/255); -end - -function cmap = whiteFade(varargin) -n = 100; -if nargin>0 - n = varargin{1}; -end - -thisColor = 'blue'; - -if nargin>1 - thisColor = varargin{2}; -end -switch thisColor - case {'gray','grey'} - cmapp = [255,255,255;240,240,240;217,217,217;189,189,189;150,150,150;115,115,115;82,82,82;37,37,37;0,0,0]; - case 'green' - cmapp = [247,252,245;229,245,224;199,233,192;161,217,155;116,196,118;65,171,93;35,139,69;0,109,44;0,68,27]; - case 'blue' - cmapp = [247,251,255;222,235,247;198,219,239;158,202,225;107,174,214;66,146,198;33,113,181;8,81,156;8,48,107]; - case 'red' - cmapp = [255,245,240;254,224,210;252,187,161;252,146,114;251,106,74;239,59,44;203,24,29;165,15,21;103,0,13]; - otherwise - warning(['sorry your color argument ' thisColor ' was not recognized']); -end - -cmap = interpomap(n,cmapp); -end - -% Eat a approximate colormap, then interpolate the rest of it up. -function cmap = interpomap(n,cmapp) - x = linspace(1,n,size(cmapp,1)); - xi = 1:n; - cmap = zeros(n,3); - for ii=1:3 - cmap(:,ii) = pchip(x,cmapp(:,ii),xi); - end - cmap = (cmap/255); % flipud?? -end - - - diff --git a/Functions/helper_functions_community/Violinplot-Matlab-master/LICENSE b/Libs/Violinplot-Matlab-master/LICENSE similarity index 100% rename from Functions/helper_functions_community/Violinplot-Matlab-master/LICENSE rename to Libs/Violinplot-Matlab-master/LICENSE diff --git a/Functions/helper_functions_community/Violinplot-Matlab-master/README.md b/Libs/Violinplot-Matlab-master/README.md similarity index 100% rename from Functions/helper_functions_community/Violinplot-Matlab-master/README.md rename to Libs/Violinplot-Matlab-master/README.md diff --git a/Functions/helper_functions_community/Violinplot-Matlab-master/Violin.m b/Libs/Violinplot-Matlab-master/Violin.m similarity index 100% rename from Functions/helper_functions_community/Violinplot-Matlab-master/Violin.m rename to Libs/Violinplot-Matlab-master/Violin.m diff --git a/Functions/helper_functions_community/Violinplot-Matlab-master/example.png b/Libs/Violinplot-Matlab-master/example.png similarity index 100% rename from Functions/helper_functions_community/Violinplot-Matlab-master/example.png rename to Libs/Violinplot-Matlab-master/example.png diff --git a/Functions/helper_functions_community/Violinplot-Matlab-master/example2.png b/Libs/Violinplot-Matlab-master/example2.png similarity index 100% rename from Functions/helper_functions_community/Violinplot-Matlab-master/example2.png rename to Libs/Violinplot-Matlab-master/example2.png diff --git a/Functions/helper_functions_community/Violinplot-Matlab-master/test_cases/testviolinplot.m b/Libs/Violinplot-Matlab-master/test_cases/testviolinplot.m similarity index 100% rename from Functions/helper_functions_community/Violinplot-Matlab-master/test_cases/testviolinplot.m rename to Libs/Violinplot-Matlab-master/test_cases/testviolinplot.m diff --git a/Functions/helper_functions_community/Violinplot-Matlab-master/violinplot.m b/Libs/Violinplot-Matlab-master/violinplot.m similarity index 100% rename from Functions/helper_functions_community/Violinplot-Matlab-master/violinplot.m rename to Libs/Violinplot-Matlab-master/violinplot.m diff --git a/Functions/helper_functions_community/autoArrangeFigures.m b/Libs/autoArrangeFigures.m similarity index 100% rename from Functions/helper_functions_community/autoArrangeFigures.m rename to Libs/autoArrangeFigures.m diff --git a/Functions/helper_functions_community/boundedlines/.gitignore b/Libs/boundedlines/.gitignore similarity index 100% rename from Functions/helper_functions_community/boundedlines/.gitignore rename to Libs/boundedlines/.gitignore diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/.gitignore b/Libs/boundedlines/Inpaint_nans/.gitignore similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/.gitignore rename to Libs/boundedlines/Inpaint_nans/.gitignore diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.html b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.html similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.html rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.html diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.png b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.png rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo.png diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_01.png b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_01.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_01.png rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_01.png diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_02.png b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_02.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_02.png rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_02.png diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_03.png b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_03.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_03.png rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_03.png diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_04.png b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_04.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_04.png rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_04.png diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_05.png b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_05.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_05.png rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_05.png diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_06.png b/Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_06.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_06.png rename to Libs/boundedlines/Inpaint_nans/demo/html/inpaint_nans_demo_06.png diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/inpaint_nans_demo_old.m b/Libs/boundedlines/Inpaint_nans/demo/inpaint_nans_demo_old.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/demo/inpaint_nans_demo_old.m rename to Libs/boundedlines/Inpaint_nans/demo/inpaint_nans_demo_old.m diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/doc/Nomination comments.rtf b/Libs/boundedlines/Inpaint_nans/doc/Nomination comments.rtf similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/doc/Nomination comments.rtf rename to Libs/boundedlines/Inpaint_nans/doc/Nomination comments.rtf diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/doc/methods_of_inpaint_nans.m b/Libs/boundedlines/Inpaint_nans/doc/methods_of_inpaint_nans.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/doc/methods_of_inpaint_nans.m rename to Libs/boundedlines/Inpaint_nans/doc/methods_of_inpaint_nans.m diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/garden50.jpg b/Libs/boundedlines/Inpaint_nans/garden50.jpg similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/garden50.jpg rename to Libs/boundedlines/Inpaint_nans/garden50.jpg diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/inpaint_nans.m b/Libs/boundedlines/Inpaint_nans/inpaint_nans.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/inpaint_nans.m rename to Libs/boundedlines/Inpaint_nans/inpaint_nans.m diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/inpaint_nans_bc.m b/Libs/boundedlines/Inpaint_nans/inpaint_nans_bc.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/inpaint_nans_bc.m rename to Libs/boundedlines/Inpaint_nans/inpaint_nans_bc.m diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/inpaint_nans_demo.m b/Libs/boundedlines/Inpaint_nans/inpaint_nans_demo.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/inpaint_nans_demo.m rename to Libs/boundedlines/Inpaint_nans/inpaint_nans_demo.m diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/license.txt b/Libs/boundedlines/Inpaint_nans/license.txt similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/license.txt rename to Libs/boundedlines/Inpaint_nans/license.txt diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/monet_adresse.jpg b/Libs/boundedlines/Inpaint_nans/monet_adresse.jpg similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/monet_adresse.jpg rename to Libs/boundedlines/Inpaint_nans/monet_adresse.jpg diff --git a/Functions/helper_functions_community/boundedlines/Inpaint_nans/test/test_main.m b/Libs/boundedlines/Inpaint_nans/test/test_main.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/Inpaint_nans/test/test_main.m rename to Libs/boundedlines/Inpaint_nans/test/test_main.m diff --git a/Functions/helper_functions_community/boundedlines/LICENSE.txt b/Libs/boundedlines/LICENSE.txt similarity index 100% rename from Functions/helper_functions_community/boundedlines/LICENSE.txt rename to Libs/boundedlines/LICENSE.txt diff --git a/Functions/helper_functions_community/boundedlines/README.html b/Libs/boundedlines/README.html similarity index 100% rename from Functions/helper_functions_community/boundedlines/README.html rename to Libs/boundedlines/README.html diff --git a/Functions/helper_functions_community/boundedlines/README.m b/Libs/boundedlines/README.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/README.m rename to Libs/boundedlines/README.m diff --git a/Functions/helper_functions_community/boundedlines/README.md b/Libs/boundedlines/README.md similarity index 100% rename from Functions/helper_functions_community/boundedlines/README.md rename to Libs/boundedlines/README.md diff --git a/Functions/helper_functions_community/boundedlines/boundedline/.gitignore b/Libs/boundedlines/boundedline/.gitignore similarity index 100% rename from Functions/helper_functions_community/boundedlines/boundedline/.gitignore rename to Libs/boundedlines/boundedline/.gitignore diff --git a/Functions/helper_functions_community/boundedlines/boundedline/boundedline.m b/Libs/boundedlines/boundedline/boundedline.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/boundedline/boundedline.m rename to Libs/boundedlines/boundedline/boundedline.m diff --git a/Functions/helper_functions_community/boundedlines/boundedline/outlinebounds.m b/Libs/boundedlines/boundedline/outlinebounds.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/boundedline/outlinebounds.m rename to Libs/boundedlines/boundedline/outlinebounds.m diff --git a/Functions/helper_functions_community/boundedlines/catuneven/.gitignore b/Libs/boundedlines/catuneven/.gitignore similarity index 100% rename from Functions/helper_functions_community/boundedlines/catuneven/.gitignore rename to Libs/boundedlines/catuneven/.gitignore diff --git a/Functions/helper_functions_community/boundedlines/catuneven/catuneven.m b/Libs/boundedlines/catuneven/catuneven.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/catuneven/catuneven.m rename to Libs/boundedlines/catuneven/catuneven.m diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_01.png b/Libs/boundedlines/readmeExtras/README_01.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_01.png rename to Libs/boundedlines/readmeExtras/README_01.png diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_02.png b/Libs/boundedlines/readmeExtras/README_02.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_02.png rename to Libs/boundedlines/readmeExtras/README_02.png diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_03.png b/Libs/boundedlines/readmeExtras/README_03.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_03.png rename to Libs/boundedlines/readmeExtras/README_03.png diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_04.png b/Libs/boundedlines/readmeExtras/README_04.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_04.png rename to Libs/boundedlines/readmeExtras/README_04.png diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_05.png b/Libs/boundedlines/readmeExtras/README_05.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_05.png rename to Libs/boundedlines/readmeExtras/README_05.png diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_06.png b/Libs/boundedlines/readmeExtras/README_06.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_06.png rename to Libs/boundedlines/readmeExtras/README_06.png diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_07.png b/Libs/boundedlines/readmeExtras/README_07.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_07.png rename to Libs/boundedlines/readmeExtras/README_07.png diff --git a/Functions/helper_functions_community/boundedlines/readmeExtras/README_08.png b/Libs/boundedlines/readmeExtras/README_08.png similarity index 100% rename from Functions/helper_functions_community/boundedlines/readmeExtras/README_08.png rename to Libs/boundedlines/readmeExtras/README_08.png diff --git a/Functions/helper_functions_community/boundedlines/singlepatch/.gitignore b/Libs/boundedlines/singlepatch/.gitignore similarity index 100% rename from Functions/helper_functions_community/boundedlines/singlepatch/.gitignore rename to Libs/boundedlines/singlepatch/.gitignore diff --git a/Functions/helper_functions_community/boundedlines/singlepatch/singlepatch.m b/Libs/boundedlines/singlepatch/singlepatch.m similarity index 100% rename from Functions/helper_functions_community/boundedlines/singlepatch/singlepatch.m rename to Libs/boundedlines/singlepatch/singlepatch.m diff --git a/Functions/helper_functions_community/colorspace/colorspace.c b/Libs/colorspace/colorspace.c similarity index 100% rename from Functions/helper_functions_community/colorspace/colorspace.c rename to Libs/colorspace/colorspace.c diff --git a/Functions/helper_functions_community/colorspace/colorspace.h b/Libs/colorspace/colorspace.h similarity index 100% rename from Functions/helper_functions_community/colorspace/colorspace.h rename to Libs/colorspace/colorspace.h diff --git a/Functions/helper_functions_community/colorspace/colorspace.m b/Libs/colorspace/colorspace.m similarity index 100% rename from Functions/helper_functions_community/colorspace/colorspace.m rename to Libs/colorspace/colorspace.m diff --git a/Functions/helper_functions_community/mat2tikz/.gitignore b/Libs/mat2tikz/.gitignore similarity index 100% rename from Functions/helper_functions_community/mat2tikz/.gitignore rename to Libs/mat2tikz/.gitignore diff --git a/Functions/helper_functions_community/mat2tikz/.travis.yml b/Libs/mat2tikz/.travis.yml similarity index 100% rename from Functions/helper_functions_community/mat2tikz/.travis.yml rename to Libs/mat2tikz/.travis.yml diff --git a/Functions/helper_functions_community/mat2tikz/AUTHORS.md b/Libs/mat2tikz/AUTHORS.md similarity index 100% rename from Functions/helper_functions_community/mat2tikz/AUTHORS.md rename to Libs/mat2tikz/AUTHORS.md diff --git a/Functions/helper_functions_community/mat2tikz/CHANGELOG.md b/Libs/mat2tikz/CHANGELOG.md similarity index 100% rename from Functions/helper_functions_community/mat2tikz/CHANGELOG.md rename to Libs/mat2tikz/CHANGELOG.md diff --git a/Functions/helper_functions_community/mat2tikz/CONTRIBUTING.md b/Libs/mat2tikz/CONTRIBUTING.md similarity index 100% rename from Functions/helper_functions_community/mat2tikz/CONTRIBUTING.md rename to Libs/mat2tikz/CONTRIBUTING.md diff --git a/Functions/helper_functions_community/mat2tikz/LICENSE.md b/Libs/mat2tikz/LICENSE.md similarity index 100% rename from Functions/helper_functions_community/mat2tikz/LICENSE.md rename to Libs/mat2tikz/LICENSE.md diff --git a/Functions/helper_functions_community/mat2tikz/README.md b/Libs/mat2tikz/README.md similarity index 100% rename from Functions/helper_functions_community/mat2tikz/README.md rename to Libs/mat2tikz/README.md diff --git a/Functions/helper_functions_community/mat2tikz/logos/matlab2tikz.svg b/Libs/mat2tikz/logos/matlab2tikz.svg similarity index 100% rename from Functions/helper_functions_community/mat2tikz/logos/matlab2tikz.svg rename to Libs/mat2tikz/logos/matlab2tikz.svg diff --git a/Functions/helper_functions_community/mat2tikz/matlab2tikz.sublime-project b/Libs/mat2tikz/matlab2tikz.sublime-project similarity index 100% rename from Functions/helper_functions_community/mat2tikz/matlab2tikz.sublime-project rename to Libs/mat2tikz/matlab2tikz.sublime-project diff --git a/Functions/helper_functions_community/mat2tikz/runtests.sh b/Libs/mat2tikz/runtests.sh similarity index 100% rename from Functions/helper_functions_community/mat2tikz/runtests.sh rename to Libs/mat2tikz/runtests.sh diff --git a/Functions/helper_functions_community/mat2tikz/src/cleanfigure.m b/Libs/mat2tikz/src/cleanfigure.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/cleanfigure.m rename to Libs/mat2tikz/src/cleanfigure.m diff --git a/Functions/helper_functions_community/mat2tikz/src/dev/formatWhitespace.m b/Libs/mat2tikz/src/dev/formatWhitespace.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/dev/formatWhitespace.m rename to Libs/mat2tikz/src/dev/formatWhitespace.m diff --git a/Functions/helper_functions_community/mat2tikz/src/figure2dot.m b/Libs/mat2tikz/src/figure2dot.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/figure2dot.m rename to Libs/mat2tikz/src/figure2dot.m diff --git a/Functions/helper_functions_community/mat2tikz/src/m2tInputParser.m b/Libs/mat2tikz/src/m2tInputParser.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/m2tInputParser.m rename to Libs/mat2tikz/src/m2tInputParser.m diff --git a/Functions/helper_functions_community/mat2tikz/src/m2tcustom.m b/Libs/mat2tikz/src/m2tcustom.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/m2tcustom.m rename to Libs/mat2tikz/src/m2tcustom.m diff --git a/Functions/helper_functions_community/mat2tikz/src/matlab2tikz.m b/Libs/mat2tikz/src/matlab2tikz.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/matlab2tikz.m rename to Libs/mat2tikz/src/matlab2tikz.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/errorUnknownEnvironment.m b/Libs/mat2tikz/src/private/errorUnknownEnvironment.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/errorUnknownEnvironment.m rename to Libs/mat2tikz/src/private/errorUnknownEnvironment.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/getEnvironment.m b/Libs/mat2tikz/src/private/getEnvironment.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/getEnvironment.m rename to Libs/mat2tikz/src/private/getEnvironment.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/guitypes.m b/Libs/mat2tikz/src/private/guitypes.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/guitypes.m rename to Libs/mat2tikz/src/private/guitypes.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/isAxis3D.m b/Libs/mat2tikz/src/private/isAxis3D.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/isAxis3D.m rename to Libs/mat2tikz/src/private/isAxis3D.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/isVersionBelow.m b/Libs/mat2tikz/src/private/isVersionBelow.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/isVersionBelow.m rename to Libs/mat2tikz/src/private/isVersionBelow.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/m2tUpdater.m b/Libs/mat2tikz/src/private/m2tUpdater.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/m2tUpdater.m rename to Libs/mat2tikz/src/private/m2tUpdater.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/m2tstrjoin.m b/Libs/mat2tikz/src/private/m2tstrjoin.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/m2tstrjoin.m rename to Libs/mat2tikz/src/private/m2tstrjoin.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/versionArray.m b/Libs/mat2tikz/src/private/versionArray.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/versionArray.m rename to Libs/mat2tikz/src/private/versionArray.m diff --git a/Functions/helper_functions_community/mat2tikz/src/private/versionString.m b/Libs/mat2tikz/src/private/versionString.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/src/private/versionString.m rename to Libs/mat2tikz/src/private/versionString.m diff --git a/Functions/helper_functions_community/mat2tikz/test/README.md b/Libs/mat2tikz/test/README.md similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/README.md rename to Libs/mat2tikz/test/README.md diff --git a/Functions/helper_functions_community/mat2tikz/test/codeReport.m b/Libs/mat2tikz/test/codeReport.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/codeReport.m rename to Libs/mat2tikz/test/codeReport.m diff --git a/Functions/helper_functions_community/mat2tikz/test/compareTimings.m b/Libs/mat2tikz/test/compareTimings.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/compareTimings.m rename to Libs/mat2tikz/test/compareTimings.m diff --git a/Functions/helper_functions_community/mat2tikz/test/examples/example_bar_plot.m b/Libs/mat2tikz/test/examples/example_bar_plot.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/examples/example_bar_plot.m rename to Libs/mat2tikz/test/examples/example_bar_plot.m diff --git a/Functions/helper_functions_community/mat2tikz/test/examples/example_quivers.m b/Libs/mat2tikz/test/examples/example_quivers.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/examples/example_quivers.m rename to Libs/mat2tikz/test/examples/example_quivers.m diff --git a/Functions/helper_functions_community/mat2tikz/test/makeLatexReport.m b/Libs/mat2tikz/test/makeLatexReport.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/makeLatexReport.m rename to Libs/mat2tikz/test/makeLatexReport.m diff --git a/Functions/helper_functions_community/mat2tikz/test/makeTapReport.m b/Libs/mat2tikz/test/makeTapReport.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/makeTapReport.m rename to Libs/mat2tikz/test/makeTapReport.m diff --git a/Functions/helper_functions_community/mat2tikz/test/makeTravisReport.m b/Libs/mat2tikz/test/makeTravisReport.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/makeTravisReport.m rename to Libs/mat2tikz/test/makeTravisReport.m diff --git a/Functions/helper_functions_community/mat2tikz/test/output/.gitignore b/Libs/mat2tikz/test/output/.gitignore similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/output/.gitignore rename to Libs/mat2tikz/test/output/.gitignore diff --git a/Functions/helper_functions_community/mat2tikz/test/private/OSVersion.m b/Libs/mat2tikz/test/private/OSVersion.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/OSVersion.m rename to Libs/mat2tikz/test/private/OSVersion.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/StreamMaker.m b/Libs/mat2tikz/test/private/StreamMaker.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/StreamMaker.m rename to Libs/mat2tikz/test/private/StreamMaker.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/VersionControlIdentifier.m b/Libs/mat2tikz/test/private/VersionControlIdentifier.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/VersionControlIdentifier.m rename to Libs/mat2tikz/test/private/VersionControlIdentifier.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/calculateMD5Hash.m b/Libs/mat2tikz/test/private/calculateMD5Hash.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/calculateMD5Hash.m rename to Libs/mat2tikz/test/private/calculateMD5Hash.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/cleanFiles.m b/Libs/mat2tikz/test/private/cleanFiles.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/cleanFiles.m rename to Libs/mat2tikz/test/private/cleanFiles.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/countNumberOfErrors.m b/Libs/mat2tikz/test/private/countNumberOfErrors.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/countNumberOfErrors.m rename to Libs/mat2tikz/test/private/countNumberOfErrors.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/emptyStage.m b/Libs/mat2tikz/test/private/emptyStage.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/emptyStage.m rename to Libs/mat2tikz/test/private/emptyStage.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/emptyStatus.m b/Libs/mat2tikz/test/private/emptyStatus.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/emptyStatus.m rename to Libs/mat2tikz/test/private/emptyStatus.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/errorHandler.m b/Libs/mat2tikz/test/private/errorHandler.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/errorHandler.m rename to Libs/mat2tikz/test/private/errorHandler.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/errorHasOccurred.m b/Libs/mat2tikz/test/private/errorHasOccurred.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/errorHasOccurred.m rename to Libs/mat2tikz/test/private/errorHasOccurred.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/execute_hash_stage.m b/Libs/mat2tikz/test/private/execute_hash_stage.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/execute_hash_stage.m rename to Libs/mat2tikz/test/private/execute_hash_stage.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/execute_plot_stage.m b/Libs/mat2tikz/test/private/execute_plot_stage.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/execute_plot_stage.m rename to Libs/mat2tikz/test/private/execute_plot_stage.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/execute_save_stage.m b/Libs/mat2tikz/test/private/execute_save_stage.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/execute_save_stage.m rename to Libs/mat2tikz/test/private/execute_save_stage.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/execute_tikz_stage.m b/Libs/mat2tikz/test/private/execute_tikz_stage.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/execute_tikz_stage.m rename to Libs/mat2tikz/test/private/execute_tikz_stage.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/execute_type_stage.m b/Libs/mat2tikz/test/private/execute_type_stage.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/execute_type_stage.m rename to Libs/mat2tikz/test/private/execute_type_stage.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/fillStruct.m b/Libs/mat2tikz/test/private/fillStruct.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/fillStruct.m rename to Libs/mat2tikz/test/private/fillStruct.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/getEnvironment.m b/Libs/mat2tikz/test/private/getEnvironment.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/getEnvironment.m rename to Libs/mat2tikz/test/private/getEnvironment.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/getStagesFromStatus.m b/Libs/mat2tikz/test/private/getStagesFromStatus.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/getStagesFromStatus.m rename to Libs/mat2tikz/test/private/getStagesFromStatus.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/hasTestFailed.m b/Libs/mat2tikz/test/private/hasTestFailed.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/hasTestFailed.m rename to Libs/mat2tikz/test/private/hasTestFailed.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/hashTableName.m b/Libs/mat2tikz/test/private/hashTableName.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/hashTableName.m rename to Libs/mat2tikz/test/private/hashTableName.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/initializeGlobalState.m b/Libs/mat2tikz/test/private/initializeGlobalState.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/initializeGlobalState.m rename to Libs/mat2tikz/test/private/initializeGlobalState.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/loadHashTable.m b/Libs/mat2tikz/test/private/loadHashTable.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/loadHashTable.m rename to Libs/mat2tikz/test/private/loadHashTable.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/m2troot.m b/Libs/mat2tikz/test/private/m2troot.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/m2troot.m rename to Libs/mat2tikz/test/private/m2troot.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/m2tstrjoin.m b/Libs/mat2tikz/test/private/m2tstrjoin.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/m2tstrjoin.m rename to Libs/mat2tikz/test/private/m2tstrjoin.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/restoreGlobalState.m b/Libs/mat2tikz/test/private/restoreGlobalState.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/restoreGlobalState.m rename to Libs/mat2tikz/test/private/restoreGlobalState.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/splitPassFailSkippedTests.m b/Libs/mat2tikz/test/private/splitPassFailSkippedTests.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/splitPassFailSkippedTests.m rename to Libs/mat2tikz/test/private/splitPassFailSkippedTests.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/splitUnreliableTests.m b/Libs/mat2tikz/test/private/splitUnreliableTests.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/splitUnreliableTests.m rename to Libs/mat2tikz/test/private/splitUnreliableTests.m diff --git a/Functions/helper_functions_community/mat2tikz/test/private/testMatlab2tikz.m b/Libs/mat2tikz/test/private/testMatlab2tikz.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/private/testMatlab2tikz.m rename to Libs/mat2tikz/test/private/testMatlab2tikz.m diff --git a/Functions/helper_functions_community/mat2tikz/test/runMatlab2TikzTests.m b/Libs/mat2tikz/test/runMatlab2TikzTests.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/runMatlab2TikzTests.m rename to Libs/mat2tikz/test/runMatlab2TikzTests.m diff --git a/Functions/helper_functions_community/mat2tikz/test/saveHashTable.m b/Libs/mat2tikz/test/saveHashTable.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/saveHashTable.m rename to Libs/mat2tikz/test/saveHashTable.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/ACID.MATLAB.8.3.md5 b/Libs/mat2tikz/test/suites/ACID.MATLAB.8.3.md5 similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/ACID.MATLAB.8.3.md5 rename to Libs/mat2tikz/test/suites/ACID.MATLAB.8.3.md5 diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/ACID.MATLAB.8.4.md5 b/Libs/mat2tikz/test/suites/ACID.MATLAB.8.4.md5 similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/ACID.MATLAB.8.4.md5 rename to Libs/mat2tikz/test/suites/ACID.MATLAB.8.4.md5 diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/ACID.Octave.3.8.0.md5 b/Libs/mat2tikz/test/suites/ACID.Octave.3.8.0.md5 similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/ACID.Octave.3.8.0.md5 rename to Libs/mat2tikz/test/suites/ACID.Octave.3.8.0.md5 diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/ACID.Octave.4.2.0.md5 b/Libs/mat2tikz/test/suites/ACID.Octave.4.2.0.md5 similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/ACID.Octave.4.2.0.md5 rename to Libs/mat2tikz/test/suites/ACID.Octave.4.2.0.md5 diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/ACID.Octave.4.2.2.md5 b/Libs/mat2tikz/test/suites/ACID.Octave.4.2.2.md5 similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/ACID.Octave.4.2.2.md5 rename to Libs/mat2tikz/test/suites/ACID.Octave.4.2.2.md5 diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/ACID.m b/Libs/mat2tikz/test/suites/ACID.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/ACID.m rename to Libs/mat2tikz/test/suites/ACID.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/issues.m b/Libs/mat2tikz/test/suites/issues.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/issues.m rename to Libs/mat2tikz/test/suites/issues.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/private/getEnvironment.m b/Libs/mat2tikz/test/suites/private/getEnvironment.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/private/getEnvironment.m rename to Libs/mat2tikz/test/suites/private/getEnvironment.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/private/herrorbar.m b/Libs/mat2tikz/test/suites/private/herrorbar.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/private/herrorbar.m rename to Libs/mat2tikz/test/suites/private/herrorbar.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/private/isEnvironment.m b/Libs/mat2tikz/test/suites/private/isEnvironment.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/private/isEnvironment.m rename to Libs/mat2tikz/test/suites/private/isEnvironment.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/private/isMATLAB.m b/Libs/mat2tikz/test/suites/private/isMATLAB.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/private/isMATLAB.m rename to Libs/mat2tikz/test/suites/private/isMATLAB.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/private/isOctave.m b/Libs/mat2tikz/test/suites/private/isOctave.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/private/isOctave.m rename to Libs/mat2tikz/test/suites/private/isOctave.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/private/isVersionBelow.m b/Libs/mat2tikz/test/suites/private/isVersionBelow.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/private/isVersionBelow.m rename to Libs/mat2tikz/test/suites/private/isVersionBelow.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/private/versionCompare.m b/Libs/mat2tikz/test/suites/private/versionCompare.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/private/versionCompare.m rename to Libs/mat2tikz/test/suites/private/versionCompare.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/testPatches.m b/Libs/mat2tikz/test/suites/testPatches.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/testPatches.m rename to Libs/mat2tikz/test/suites/testPatches.m diff --git a/Functions/helper_functions_community/mat2tikz/test/suites/testSurfshader.m b/Libs/mat2tikz/test/suites/testSurfshader.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/suites/testSurfshader.m rename to Libs/mat2tikz/test/suites/testSurfshader.m diff --git a/Functions/helper_functions_community/mat2tikz/test/template/.gitignore b/Libs/mat2tikz/test/template/.gitignore similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/template/.gitignore rename to Libs/mat2tikz/test/template/.gitignore diff --git a/Functions/helper_functions_community/mat2tikz/test/template/Makefile b/Libs/mat2tikz/test/template/Makefile similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/template/Makefile rename to Libs/mat2tikz/test/template/Makefile diff --git a/Functions/helper_functions_community/mat2tikz/test/template/data/.gitignore b/Libs/mat2tikz/test/template/data/.gitignore similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/template/data/.gitignore rename to Libs/mat2tikz/test/template/data/.gitignore diff --git a/Functions/helper_functions_community/mat2tikz/test/template/data/converted/Makefile b/Libs/mat2tikz/test/template/data/converted/Makefile similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/template/data/converted/Makefile rename to Libs/mat2tikz/test/template/data/converted/Makefile diff --git a/Functions/helper_functions_community/mat2tikz/test/template/data/reference/Makefile b/Libs/mat2tikz/test/template/data/reference/Makefile similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/template/data/reference/Makefile rename to Libs/mat2tikz/test/template/data/reference/Makefile diff --git a/Functions/helper_functions_community/mat2tikz/test/testGraphical.m b/Libs/mat2tikz/test/testGraphical.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/testGraphical.m rename to Libs/mat2tikz/test/testGraphical.m diff --git a/Functions/helper_functions_community/mat2tikz/test/testHeadless.m b/Libs/mat2tikz/test/testHeadless.m similarity index 100% rename from Functions/helper_functions_community/mat2tikz/test/testHeadless.m rename to Libs/mat2tikz/test/testHeadless.m diff --git a/Functions/helper_functions_community/png/nt_.png b/Libs/png/nt_.png similarity index 100% rename from Functions/helper_functions_community/png/nt_.png rename to Libs/png/nt_.png diff --git a/Functions/helper_functions_community/schemer/.gitattributes b/Libs/schemer/.gitattributes similarity index 100% rename from Functions/helper_functions_community/schemer/.gitattributes rename to Libs/schemer/.gitattributes diff --git a/Functions/helper_functions_community/schemer/.gitignore b/Libs/schemer/.gitignore similarity index 100% rename from Functions/helper_functions_community/schemer/.gitignore rename to Libs/schemer/.gitignore diff --git a/Functions/helper_functions_community/schemer/CONTRIBUTING.md b/Libs/schemer/CONTRIBUTING.md similarity index 100% rename from Functions/helper_functions_community/schemer/CONTRIBUTING.md rename to Libs/schemer/CONTRIBUTING.md diff --git a/Functions/helper_functions_community/schemer/LICENSE b/Libs/schemer/LICENSE similarity index 100% rename from Functions/helper_functions_community/schemer/LICENSE rename to Libs/schemer/LICENSE diff --git a/Functions/helper_functions_community/schemer/README.md b/Libs/schemer/README.md similarity index 100% rename from Functions/helper_functions_community/schemer/README.md rename to Libs/schemer/README.md diff --git a/Functions/helper_functions_community/schemer/develop/RGBint2hex.m b/Libs/schemer/develop/RGBint2hex.m similarity index 100% rename from Functions/helper_functions_community/schemer/develop/RGBint2hex.m rename to Libs/schemer/develop/RGBint2hex.m diff --git a/Functions/helper_functions_community/schemer/develop/annotated_default.png b/Libs/schemer/develop/annotated_default.png similarity index 100% rename from Functions/helper_functions_community/schemer/develop/annotated_default.png rename to Libs/schemer/develop/annotated_default.png diff --git a/Functions/helper_functions_community/schemer/develop/color2javaRGBint.m b/Libs/schemer/develop/color2javaRGBint.m similarity index 100% rename from Functions/helper_functions_community/schemer/develop/color2javaRGBint.m rename to Libs/schemer/develop/color2javaRGBint.m diff --git a/Functions/helper_functions_community/schemer/develop/sample.cpp b/Libs/schemer/develop/sample.cpp similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.cpp rename to Libs/schemer/develop/sample.cpp diff --git a/Functions/helper_functions_community/schemer/develop/sample.html b/Libs/schemer/develop/sample.html similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.html rename to Libs/schemer/develop/sample.html diff --git a/Functions/helper_functions_community/schemer/develop/sample.java b/Libs/schemer/develop/sample.java similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.java rename to Libs/schemer/develop/sample.java diff --git a/Functions/helper_functions_community/schemer/develop/sample.m b/Libs/schemer/develop/sample.m similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.m rename to Libs/schemer/develop/sample.m diff --git a/Functions/helper_functions_community/schemer/develop/sample.tlc b/Libs/schemer/develop/sample.tlc similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.tlc rename to Libs/schemer/develop/sample.tlc diff --git a/Functions/helper_functions_community/schemer/develop/sample.v b/Libs/schemer/develop/sample.v similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.v rename to Libs/schemer/develop/sample.v diff --git a/Functions/helper_functions_community/schemer/develop/sample.vhdl b/Libs/schemer/develop/sample.vhdl similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.vhdl rename to Libs/schemer/develop/sample.vhdl diff --git a/Functions/helper_functions_community/schemer/develop/sample.x3d b/Libs/schemer/develop/sample.x3d similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.x3d rename to Libs/schemer/develop/sample.x3d diff --git a/Functions/helper_functions_community/schemer/develop/sample.x3dv b/Libs/schemer/develop/sample.x3dv similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.x3dv rename to Libs/schemer/develop/sample.x3dv diff --git a/Functions/helper_functions_community/schemer/develop/sample.xml b/Libs/schemer/develop/sample.xml similarity index 100% rename from Functions/helper_functions_community/schemer/develop/sample.xml rename to Libs/schemer/develop/sample.xml diff --git a/Functions/helper_functions_community/schemer/develop/short_sample.m b/Libs/schemer/develop/short_sample.m similarity index 100% rename from Functions/helper_functions_community/schemer/develop/short_sample.m rename to Libs/schemer/develop/short_sample.m diff --git a/Functions/helper_functions_community/schemer/develop/template_scheme.prf b/Libs/schemer/develop/template_scheme.prf similarity index 100% rename from Functions/helper_functions_community/schemer/develop/template_scheme.prf rename to Libs/schemer/develop/template_scheme.prf diff --git a/Functions/helper_functions_community/schemer/logo.png b/Libs/schemer/logo.png similarity index 100% rename from Functions/helper_functions_community/schemer/logo.png rename to Libs/schemer/logo.png diff --git a/Functions/helper_functions_community/schemer/schemer_export.m b/Libs/schemer/schemer_export.m similarity index 100% rename from Functions/helper_functions_community/schemer/schemer_export.m rename to Libs/schemer/schemer_export.m diff --git a/Functions/helper_functions_community/schemer/schemer_import.m b/Libs/schemer/schemer_import.m similarity index 100% rename from Functions/helper_functions_community/schemer/schemer_import.m rename to Libs/schemer/schemer_import.m diff --git a/Functions/helper_functions_community/schemer/schemes/.gitattributes b/Libs/schemer/schemes/.gitattributes similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/.gitattributes rename to Libs/schemer/schemes/.gitattributes diff --git a/Functions/helper_functions_community/schemer/schemes/.gitignore b/Libs/schemer/schemes/.gitignore similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/.gitignore rename to Libs/schemer/schemes/.gitignore diff --git a/Functions/helper_functions_community/schemer/schemes/CONTRIBUTING.md b/Libs/schemer/schemes/CONTRIBUTING.md similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/CONTRIBUTING.md rename to Libs/schemer/schemes/CONTRIBUTING.md diff --git a/Functions/helper_functions_community/schemer/schemes/LICENSE b/Libs/schemer/schemes/LICENSE similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/LICENSE rename to Libs/schemer/schemes/LICENSE diff --git a/Functions/helper_functions_community/schemer/schemes/README.md b/Libs/schemer/schemes/README.md similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/README.md rename to Libs/schemer/schemes/README.md diff --git a/Functions/helper_functions_community/schemer/schemes/SilasColorSchemeForMATLAB.prf b/Libs/schemer/schemes/SilasColorSchemeForMATLAB.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/SilasColorSchemeForMATLAB.prf rename to Libs/schemer/schemes/SilasColorSchemeForMATLAB.prf diff --git a/Functions/helper_functions_community/schemer/schemes/cobalt.prf b/Libs/schemer/schemes/cobalt.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/cobalt.prf rename to Libs/schemer/schemes/cobalt.prf diff --git a/Functions/helper_functions_community/schemer/schemes/darkmate.prf b/Libs/schemer/schemes/darkmate.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/darkmate.prf rename to Libs/schemer/schemes/darkmate.prf diff --git a/Functions/helper_functions_community/schemer/schemes/darksteel.prf b/Libs/schemer/schemes/darksteel.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/darksteel.prf rename to Libs/schemer/schemes/darksteel.prf diff --git a/Functions/helper_functions_community/schemer/schemes/default.prf b/Libs/schemer/schemes/default.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/default.prf rename to Libs/schemer/schemes/default.prf diff --git a/Functions/helper_functions_community/schemer/schemes/matrix.prf b/Libs/schemer/schemes/matrix.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/matrix.prf rename to Libs/schemer/schemes/matrix.prf diff --git a/Functions/helper_functions_community/schemer/schemes/monokai.prf b/Libs/schemer/schemes/monokai.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/monokai.prf rename to Libs/schemer/schemes/monokai.prf diff --git a/Functions/helper_functions_community/schemer/schemes/oblivion.prf b/Libs/schemer/schemes/oblivion.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/oblivion.prf rename to Libs/schemer/schemes/oblivion.prf diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/cobalt.png b/Libs/schemer/schemes/screenshots/cobalt.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/cobalt.png rename to Libs/schemer/schemes/screenshots/cobalt.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/darkmate.png b/Libs/schemer/schemes/screenshots/darkmate.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/darkmate.png rename to Libs/schemer/schemes/screenshots/darkmate.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/darksteel.png b/Libs/schemer/schemes/screenshots/darksteel.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/darksteel.png rename to Libs/schemer/schemes/screenshots/darksteel.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/default.png b/Libs/schemer/schemes/screenshots/default.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/default.png rename to Libs/schemer/schemes/screenshots/default.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/matrix.png b/Libs/schemer/schemes/screenshots/matrix.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/matrix.png rename to Libs/schemer/schemes/screenshots/matrix.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/monokai.png b/Libs/schemer/schemes/screenshots/monokai.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/monokai.png rename to Libs/schemer/schemes/screenshots/monokai.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/oblivion.png b/Libs/schemer/schemes/screenshots/oblivion.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/oblivion.png rename to Libs/schemer/schemes/screenshots/oblivion.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/solarized-dark.png b/Libs/schemer/schemes/screenshots/solarized-dark.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/solarized-dark.png rename to Libs/schemer/schemes/screenshots/solarized-dark.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/solarized-light.png b/Libs/schemer/schemes/screenshots/solarized-light.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/solarized-light.png rename to Libs/schemer/schemes/screenshots/solarized-light.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/tango.png b/Libs/schemer/schemes/screenshots/tango.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/tango.png rename to Libs/schemer/schemes/screenshots/tango.png diff --git a/Functions/helper_functions_community/schemer/schemes/screenshots/vibrant.png b/Libs/schemer/schemes/screenshots/vibrant.png similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/screenshots/vibrant.png rename to Libs/schemer/schemes/screenshots/vibrant.png diff --git a/Functions/helper_functions_community/schemer/schemes/solarized-dark.prf b/Libs/schemer/schemes/solarized-dark.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/solarized-dark.prf rename to Libs/schemer/schemes/solarized-dark.prf diff --git a/Functions/helper_functions_community/schemer/schemes/solarized-light.prf b/Libs/schemer/schemes/solarized-light.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/solarized-light.prf rename to Libs/schemer/schemes/solarized-light.prf diff --git a/Functions/helper_functions_community/schemer/schemes/tango.prf b/Libs/schemer/schemes/tango.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/tango.prf rename to Libs/schemer/schemes/tango.prf diff --git a/Functions/helper_functions_community/schemer/schemes/vibrant.prf b/Libs/schemer/schemes/vibrant.prf similarity index 100% rename from Functions/helper_functions_community/schemer/schemes/vibrant.prf rename to Libs/schemer/schemes/vibrant.prf diff --git a/Functions/helper_functions_community/sendolmail.m b/Libs/sendolmail.m similarity index 100% rename from Functions/helper_functions_community/sendolmail.m rename to Libs/sendolmail.m diff --git a/Functions/settingsdlg/.gitignore b/Libs/settingsdlg/.gitignore similarity index 100% rename from Functions/settingsdlg/.gitignore rename to Libs/settingsdlg/.gitignore diff --git a/Functions/settingsdlg/License.txt b/Libs/settingsdlg/License.txt similarity index 98% rename from Functions/settingsdlg/License.txt rename to Libs/settingsdlg/License.txt index b808cd3..bedf626 100644 --- a/Functions/settingsdlg/License.txt +++ b/Libs/settingsdlg/License.txt @@ -1,26 +1,26 @@ -Copyright (c) 2018, Rody Oldenhuis -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of this project. +Copyright (c) 2018, Rody Oldenhuis +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of this project. diff --git a/Functions/settingsdlg/README.md b/Libs/settingsdlg/README.md similarity index 100% rename from Functions/settingsdlg/README.md rename to Libs/settingsdlg/README.md diff --git a/Functions/settingsdlg/Screen.png b/Libs/settingsdlg/Screen.png similarity index 100% rename from Functions/settingsdlg/Screen.png rename to Libs/settingsdlg/Screen.png diff --git a/Functions/settingsdlg/settingsdlg.m b/Libs/settingsdlg/settingsdlg.m similarity index 100% rename from Functions/settingsdlg/settingsdlg.m rename to Libs/settingsdlg/settingsdlg.m diff --git a/Functions/settingsdlg/settingsdlg.odt b/Libs/settingsdlg/settingsdlg.odt similarity index 100% rename from Functions/settingsdlg/settingsdlg.odt rename to Libs/settingsdlg/settingsdlg.odt diff --git a/Functions/settingsdlg/settingsdlg.pdf b/Libs/settingsdlg/settingsdlg.pdf similarity index 100% rename from Functions/settingsdlg/settingsdlg.pdf rename to Libs/settingsdlg/settingsdlg.pdf diff --git a/projects/HighSpeedExperiment_2024/auswertung/analyzeDB.m b/projects/HighSpeedExperiment_2024/auswertung/analyzeDB.m new file mode 100644 index 0000000..0183686 --- /dev/null +++ b/projects/HighSpeedExperiment_2024/auswertung/analyzeDB.m @@ -0,0 +1,85 @@ +basePath = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; +useGui = 0; + +db = DBHandler("pathToDB",[basePath,'silas_labor.db']); +if useGui + filterParams = db.promptFilterParameters(); + selectedFields = db.promptSelectFields(); +else + filterParams = db.tables; + filterParams.Configurations = struct( ... + 'bitrate', [], ... + 'db_mode', [], ... + 'fiber_length', 10, ... + 'interference_attenuation', [], ... + 'interference_path_length', [], ... + 'is_mpi', 0, ... + 'pam_level', [], ... + 'precomp_amp', [], ... + 'rop_attenuation', 0, ... + 'symbolrate', [], ... + 'v_awg', [], ... + 'v_bias', [], ... + 'wavelength', 1310 ... + ); + filterParams.Equalizer.eq_type = equalizer_structure.vnle_pf_mlse; + filterParams.Equalizer.eq_id = equalizer_structure.vnle; + selectedFields = {'Runs.run_id','BERs.ber_id','Equalizer.eq_id','Equalizer.eq_type','BERs.ber','BERs.occurrence',... + 'Configurations.db_mode','Configurations.pam_level','Configurations.bitrate','Configurations.symbolrate','Configurations.fiber_length','Configurations.wavelength','Configurations.precomp_amp',... + 'Measurements.power_rop','Measurements.power_laser','Measurements.power_pd_in'}; +end + + +[dataTable,~] = db.queryDB(filterParams, selectedFields); + +% Calculate the mean BER for each combination of 'run_id' and 'eq_type' +groupedData = groupsummary(dataTable, {'run_id', 'eq_type'}, 'mean', {'ber', 'power_rop','power_pd_in'}); + +% Extract unique rows from dataTable for each run_id with relevant configuration details +uniqueConfigFields = {'run_id', 'pam_level', 'bitrate','symbolrate', 'fiber_length', 'wavelength', 'precomp_amp', 'db_mode'}; +[~, uniqueIdx] = unique(dataTable.run_id); % Get unique run_id indices +configDetails = dataTable(uniqueIdx, uniqueConfigFields); % Extract unique configurations for each run_id + +% Prepare the join key for both groupedData and configDetails +groupedDataTable = table(groupedData.run_id, groupedData.eq_type, groupedData.GroupCount, groupedData.mean_ber,groupedData.mean_power_rop,groupedData.mean_power_pd_in, ... + 'VariableNames', {'run_id', 'eq_type', 'GroupCount', 'mean_ber','mean_power_rop','mean_power_pd_in'}); + +% Join groupedData with configDetails on the run_id field +joinedData = join(groupedDataTable, configDetails, 'Keys', 'run_id'); + + + + +a=plot(fsym_vals.*1e-9.*log2(M_vals(modulation_iter)),ber_ffe(:,modulation_iter),... + 'Color',cols(modulation_iter,:),'MarkerSize',2,'LineWidth',1,... + 'Marker','o','MarkerFaceColor',cols(modulation_iter,:),'MarkerEdgeColor','black',... + 'DisplayName',['PAM ',num2str(M_vals(modulation_iter))]); + +a.DataTipTemplate.DataTipRows(1).Label = 'Bitr'; +a.DataTipTemplate.DataTipRows(1).Format = ['%.1f',' Gbps']; + +a.DataTipTemplate.DataTipRows(2).Label = 'BER'; +a.DataTipTemplate.DataTipRows(2).Format ='%.1e'; + +a.DataTipTemplate.DataTipRows(3).Label = 'P_{out}'; +a.DataTipTemplate.DataTipRows(3).Value = rop(:,modulation_iter); +a.DataTipTemplate.DataTipRows(3).Format = ['%.2f',' dBm']; + +a.DataTipTemplate.DataTipRows(4).Label = 'Baudr'; +a.DataTipTemplate.DataTipRows(4).Value = fsym_vals.*1e-9; +a.DataTipTemplate.DataTipRows(4).Format = ['%.1f',' GBd']; + + +a.DataTipTemplate.FontSize = 9; +a.DataTipTemplate.FontName = 'arial'; + +% Continue with the rest of your plot settings +title('Opt B2B') +yline(3.8e-3, 'DisplayName', 'HD-FEC', 'LineStyle', '--', 'HandleVisibility', 'off'); +xlabel('Bit Rate in GBps'); +ylabel('Bit Error Rate (BER)'); +set(gca, 'yscale', 'log'); +set(gca, 'Box', 'on'); +grid on; +grid minor; +legend('Interpreter', 'none'); diff --git a/projects/HighSpeedExperiment_2024/auswertung/auswertungs_app.mlapp b/projects/HighSpeedExperiment_2024/auswertung/auswertungs_app.mlapp new file mode 100644 index 0000000000000000000000000000000000000000..c7cc12d5293fc2d16d5f5292d07eb2b2d656e251 GIT binary patch literal 45328 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 bKVbef7!{0; + + %Loop through sliced oscilloscope measurement + parfor o = 1:numel(rx_sync) rx_sig = rx_sync{o}; - switch pathTable.db_mode(i) - case 0 - %normal signaling - eq_ = EQ("Ne",[50,7,7],"Nb",[0,0,0],"training_length",4096*2,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.05,"DDmu",[0.0004 0.0004 0.0004 0.0004 ],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); - eq_sig = vnle(eq_,rx_sig,tx_symbols); + M = dataTable.pam_level(i); - case 1 - %db targeting => less precompensation; pre-coded + switch dataTable.db_mode(i) + + case db_mode.no_db + + %FFE + eq_ffe(o) = EQ("Ne",ffe_order,"Nb",dfe_order,"training_length",len_tr,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.05,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); + [eq_sig,eq_noise,ber_ffe(o),totalErrors] = vnle( eq_ffe(o),M,rx_sig,tx_symbols, tx_bits); + + %VNLE + eq_vnle(o) = EQ("Ne",vnle_order,"Nb",dfe_order,"training_length",len_tr,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.05,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); + [eq_sig,eq_noise,ber_vnle(o),totalErrors] = vnle(eq_vnle(o),M,rx_sig,tx_symbols, tx_bits); + + %VNLE + PF + MLSE + eq_mlse(o) = EQ("Ne",vnle_order,"Nb",dfe_order,"training_length",len_tr,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.05,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); + pf_(o) = Postfilter("ncoeff",2); + mlse_(o) = MLSE("DIR",[0,0],"duobinary_output",0,"M",[],"trellis_states",[]); + [eq_sig,eq_noise,ber_mlse(o),totalErrors] = vnle_postfilter_mlse(eq_mlse(o) , pf_(o), mlse_(o),M, rx_sig,tx_symbols, tx_bits); + + case db_mode.db_precoded + + %EQ targets DB => less precompensation; pre-coded + M = dataTable.pam_level(i); + mlse_db_pre(o) = MLSE("DIR",[1,1],"duobinary_output",1,"M",M,"trellis_states",PAMmapper(M,0).levels); + eq_db_pre(o) = EQ("Ne",vnle_order,"Nb",dfe_order,"training_length",len_tr,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.05,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); + [eq_sig,eq_noise,ber_db_pre(o),totalErrors] = duobinary_target(eq_db_pre(o), mlse_db_pre(o),M, rx_sig, tx_symbols, tx_bits); + %->append BER to DB + + case db_mode.db_encoded - case 2 %db signaling => db encoded - + M = dataTable.pam_level(i); + mlse_db_enc(o) = MLSE("DIR",[1,1],"duobinary_output",1,"M",M,"trellis_states",PAMmapper(M,0).levels); + eq_db_enc(o) = EQ("Ne",vnle_order,"Nb",dfe_order,"training_length",len_tr,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.05,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); + [eq_sig,eq_noise,ber_db_enc(o),totalErrors] = duobinary_signaling(eq_db_enc(o), mlse_db_enc(o),M, rx_sig, tx_symbols, tx_bits); + %->append BER to DB end - rx_bits = PAMmapper(4,0).demap(eq_sig); - [~,~,ber_vnle(o),~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); - end - %2.2) Store BER to DB Table "BERs" - % structure = ""; % Description or Comment of BER technqiue - % settings = EQ; - % - % newBer = struct(... - % 'ber_id', NaN,... - % 'run_id', current_run_id,... - % 'processing_structure', structure,... - % 'processing_settings', settings,... - % 'ber', jsonencode(ber)... - % ); - % - % db.appendToTable('BERs', newBer); + for o = 1:numel(rx_sync) + switch dataTable.db_mode(i) + + case db_mode.no_db + + %FFE + eq_type = equalizer_structure.ffe; + db.addBEREntry(ber_ffe(o), o, dataTable.run_id(i), eq_ffe(o), dfe_, [], [], eq_type, ffe_order, dfe_order, len_tr, mu_ffe, mu_dfe, mu_dc, "FFE"); + showCurrentMeasurement('EQ', string(eq_type), 'BER',ber_ffe(o), 'Mode', string(db_mode(dataTable.db_mode(i))), 'Len', dataTable.fiber_length(i) ,'PAM' , dataTable.pam_level(i) , 'GBit/s' ,dataTable.bitrate(i).*1e-9, 'Lambda' ,dataTable.wavelength(i) ); + + %VNLE + eq_type = equalizer_structure.vnle; + db.addBEREntry(ber_vnle(o), o, dataTable.run_id(i), eq_vnle(o), dfe_, [], [], eq_type, vnle_order, dfe_order, len_tr, mu_ffe, mu_dfe, mu_dc, "VNLE"); + showCurrentMeasurement('EQ', string(eq_type), 'BER',ber_vnle(o), 'Mode', string(db_mode(dataTable.db_mode(i))), 'Len', dataTable.fiber_length(i) ,'PAM' , dataTable.pam_level(i) , 'GBit/s' ,dataTable.bitrate(i).*1e-9, 'Lambda' ,dataTable.wavelength(i) ); + + %MLSE + eq_type = equalizer_structure.vnle_pf_mlse; + db.addBEREntry(ber_mlse(o), o, dataTable.run_id(i), eq_mlse(o), dfe_, mlse_(o), pf_(o), eq_type, vnle_order, dfe_order, len_tr, mu_ffe, mu_dfe, mu_dc, "VNLE;PF;MLSE"); + showCurrentMeasurement('EQ', string(eq_type), 'BER',ber_mlse(o), 'Mode', string(db_mode(dataTable.db_mode(i))), 'Len', dataTable.fiber_length(i) ,'PAM' , dataTable.pam_level(i) , 'GBit/s' ,dataTable.bitrate(i).*1e-9, 'Lambda' ,dataTable.wavelength(i) ); + + case db_mode.db_precoded + + %db_precoded + eq_type = equalizer_structure.db_precoded; + db.addBEREntry(ber_db_pre(o), o, dataTable.run_id(i), eq_db_pre(o), dfe_, mlse_db_pre(o), [], eq_type, vnle_order, dfe_order, len_tr, mu_ffe, mu_dfe, mu_dc, "DB Precode;DB Target;MLSE DB Decode;Modulo"); + showCurrentMeasurement('EQ', string(eq_type), 'BER',ber_db_pre(o), 'Mode', string(db_mode(dataTable.db_mode(i))), 'Len', dataTable.fiber_length(i) ,'PAM' , dataTable.pam_level(i) , 'GBit/s' ,dataTable.bitrate(i).*1e-9, 'Lambda' ,dataTable.wavelength(i) ); + + case db_mode.db_encoded + + %db_encoded + eq_type = equalizer_structure.db_encoded; + db.addBEREntry(ber_db_enc(o), o, dataTable.run_id(i), eq_db_enc(o), dfe_, mlse_db_enc(o), [], eq_type, vnle_order, dfe_order, len_tr, mu_ffe, mu_dfe, mu_dc, "DB Precode;DB Encode;DB Target;MLSE DB Decode;Modulo"); + showCurrentMeasurement('EQ', string(eq_type), 'BER',ber_db_enc(o), 'Mode', string(db_mode(dataTable.db_mode(i))), 'Len', dataTable.fiber_length(i) ,'PAM' , dataTable.pam_level(i) , 'GBit/s' ,dataTable.bitrate(i).*1e-9, 'Lambda' ,dataTable.wavelength(i) ); + + end + + end end -%3) Look at BER that just ran +fprintf('\n%s SIMULATION COMPLETE %s \n \n', repmat('=', 1, 35), repmat('=', 1, 35)); % Print a blank line, then a thick line of 80 '=' characters, then another blank line