├── .gitattributes
├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── .gitlab-ci.yml
├── CONTRIBUTING.md
├── Convolution.prj
├── Data
├── .gitkeep
├── 1st_baptist_nashville_balcony.rights
├── 1st_baptist_nashville_balcony.wav
├── flower.jpg
├── lettert.png
└── ringtone.wav
├── Images
├── AddOnsIcon.png
├── BasicConvolutionPLot.png
├── Conv1D.gif
├── Conv2D.gif
├── DilationAnimation.gif
├── EmbossedRose.png
├── EndIcon.png
├── LTIPlot.png
├── OpenInFX.png
├── OpenInMO.png
├── TestedWith.json
└── image_9.png
├── InstructorResources
└── Solutions
│ ├── ConvolutionBasicsSoln.mlx
│ ├── ConvolutionFiltersSoln.mlx
│ ├── ConvolutionLTISoln.mlx
│ └── PracticeProblemsSoln.mlx
├── LICENSE.md
├── MainMenu.mlx
├── README.md
├── README.mlx
├── SECURITY.md
├── Scripts
├── ConvolutionBasics.mlx
├── ConvolutionFilters.mlx
├── ConvolutionLTI.mlx
└── PracticeProblems.mlx
├── SoftwareTests
├── CheckTestResults.m
├── CreateBadge.m
├── FunctionTests.m
├── PostFiles
│ ├── PostConvolutionBasics.m
│ ├── PostConvolutionBasicsSoln.m
│ ├── PostConvolutionFilters.m
│ ├── PostConvolutionFiltersSoln.m
│ ├── PostConvolutionLTI.m
│ ├── PostConvolutionLTISoln.m
│ ├── PostPracticeProblemSolns.m
│ └── PostPracticeProblemSolnsSoln.m
├── PostSmokeTest.m
├── PreFiles
│ ├── PreConvolutionBasics.m
│ ├── PreConvolutionBasicsSoln.m
│ ├── PreConvolutionFilters.m
│ ├── PreConvolutionFiltersSoln.m
│ ├── PreConvolutionLTI.m
│ ├── PreConvolutionLTISoln.m
│ ├── PrePracticeProblemSolns.m
│ └── PrePracticeProblemSolnsSoln.m
├── RunAllTests.m
├── SmokeTests.m
├── SolnSmokeTests.m
└── TestResults_R2024b.txt
├── Utilities
├── OldVersions
│ ├── MainMenuOld.mlx
│ └── READMEOld.mlx
├── ProjectSettings.mat
├── ProjectShutdown.m
├── ProjectStartup.m
├── ProjectStartupApp.m
└── SurveyLinks.mat
├── license.txt
└── resources
└── project
├── 6xhH2l9GP9loT6TdFn_Mo65sDHg
├── P8PSrqcBHMbGhqD2r1d9oc0h3TUd.xml
└── P8PSrqcBHMbGhqD2r1d9oc0h3TUp.xml
├── 8h3kimKoV3g5SPdcFPq6bNqde20
├── yvc00et_D9w1RZcV5T2-bniDUu0d.xml
└── yvc00et_D9w1RZcV5T2-bniDUu0p.xml
├── BT5hWoz-UTefONdqForZyI91O8Y
├── Ur1esh7xN9L6aqDUKBE31DKE1Qod.xml
└── Ur1esh7xN9L6aqDUKBE31DKE1Qop.xml
├── EEtUlUb-dLAdf0KpMVivaUlztwA
├── -DlbouAcj0Owvo00QtTpWujx9YMd.xml
├── -DlbouAcj0Owvo00QtTpWujx9YMp.xml
├── DxJWFQ6s-5tgLo-3uCpCdq16n-sd.xml
├── DxJWFQ6s-5tgLo-3uCpCdq16n-sp.xml
├── PAote5_-RAZ9uo-gA_FuZhRSquQd.xml
├── PAote5_-RAZ9uo-gA_FuZhRSquQp.xml
├── cn2Ee7NifKI7ffnw_Fjz5lrC1Qgd.xml
├── cn2Ee7NifKI7ffnw_Fjz5lrC1Qgp.xml
├── d-PM_SU5Hw6XmBK8zA1PIfrPki0d.xml
├── d-PM_SU5Hw6XmBK8zA1PIfrPki0p.xml
├── e7wCov_BYJUY6VsFZYx5ab3064gd.xml
├── e7wCov_BYJUY6VsFZYx5ab3064gp.xml
├── x9kRh-n1S7s6yE1EzN4stHJjWq0d.xml
└── x9kRh-n1S7s6yE1EzN4stHJjWq0p.xml
├── HoHDHQ_WvHAAKj5aJOrvrg_vpt8
├── xXlmKuOQ7YT_G1elNhbKQIUqSRMd.xml
└── xXlmKuOQ7YT_G1elNhbKQIUqSRMp.xml
├── KAXfQgCar2Yb8zOxgvf9hdmLP1E
├── sZWUss_PB_DhtUei_LX7trqUyaYd.xml
├── sZWUss_PB_DhtUei_LX7trqUyaYp.xml
├── xcK8fO1pjra5DR0jot5vrzlBV84d.xml
└── xcK8fO1pjra5DR0jot5vrzlBV84p.xml
├── NjSPEMsIuLUyIpr2u1Js5bVPsOs
├── 2kj09UetkV_lru3gvSPXnY6-nM4d.xml
├── 2kj09UetkV_lru3gvSPXnY6-nM4p.xml
├── KKyDJtbdIBOlaeHmIZd5VX6vqx8d.xml
├── KKyDJtbdIBOlaeHmIZd5VX6vqx8p.xml
├── QWNDYJD5mGW1bWYvPx9DtKnxzw4d.xml
├── QWNDYJD5mGW1bWYvPx9DtKnxzw4p.xml
├── R1RggVhA72agIvELiuhWPRS8F0Id.xml
├── R1RggVhA72agIvELiuhWPRS8F0Ip.xml
├── aEHSZBIY-yve10yGis12Zr5DLZod.xml
├── aEHSZBIY-yve10yGis12Zr5DLZop.xml
├── j4xwF_j8iFTVayUMfxLgMnTbencd.xml
├── j4xwF_j8iFTVayUMfxLgMnTbencp.xml
├── r8LR4nLmg9ai3oHrW1r_-KocQzkd.xml
└── r8LR4nLmg9ai3oHrW1r_-KocQzkp.xml
├── Project.xml
├── ZN2RlSIbyWXhOxbxxI4hOawbMD4
├── p5HYYVUpTuYgZwnT8QkkzaoJraUd.xml
├── p5HYYVUpTuYgZwnT8QkkzaoJraUp.xml
├── q4FWbcu8zEbneDjWzNwfvfvjQNAd.xml
├── q4FWbcu8zEbneDjWzNwfvfvjQNAp.xml
├── s-04wUzHjOhlMa1CW_zpJwm8iDMd.xml
└── s-04wUzHjOhlMa1CW_zpJwm8iDMp.xml
├── ZdVxxv9BsNz7MGUxtEc6Pq3qh1M
├── -mSO0J7ItHIgO7c8PKPkcBPBAbMd.xml
├── -mSO0J7ItHIgO7c8PKPkcBPBAbMp.xml
├── 5InFewK6fGZq3ty6eSEAj3MiKi8d.xml
├── 5InFewK6fGZq3ty6eSEAj3MiKi8p.xml
├── 99pudfj12BA9A1k87a_Dv4DFvPgd.xml
├── 99pudfj12BA9A1k87a_Dv4DFvPgp.xml
├── QOpe-1pctdftDIjwQLRdjOUZW44d.xml
├── QOpe-1pctdftDIjwQLRdjOUZW44p.xml
├── SbYIEUdleY6e74tBazJyZWOUkSsd.xml
├── SbYIEUdleY6e74tBazJyZWOUkSsp.xml
├── fLKObL0j7NxgbhncYTq0NqApBMYd.xml
└── fLKObL0j7NxgbhncYTq0NqApBMYp.xml
├── fjRQtWiSIy7hIlj-Kmk87M7s21k
├── NjSPEMsIuLUyIpr2u1Js5bVPsOsd.xml
└── NjSPEMsIuLUyIpr2u1Js5bVPsOsp.xml
├── iMwdHOXOBiBXhnA_li8gtEJVTjc
├── RMvf4mEDuznAOqU6SKNmIWErfxgd.xml
├── RMvf4mEDuznAOqU6SKNmIWErfxgp.xml
├── ZTr3GAe6p03ZVs2FdKKE0JsiFMQd.xml
├── ZTr3GAe6p03ZVs2FdKKE0JsiFMQp.xml
├── nGmc4yUWSwVpS8w8tP7IolwQs0Ed.xml
├── nGmc4yUWSwVpS8w8tP7IolwQs0Ep.xml
├── uIbyU9dPEHKvxjdwx5pD9PDDCZYd.xml
└── uIbyU9dPEHKvxjdwx5pD9PDDCZYp.xml
├── qaw0eS1zuuY1ar9TdPn1GMfrjbQ
├── 2uRqUwgzsMPtKV1vY4JvGEQwdJId.xml
├── 2uRqUwgzsMPtKV1vY4JvGEQwdJIp.xml
├── 8h3kimKoV3g5SPdcFPq6bNqde20d.xml
├── 8h3kimKoV3g5SPdcFPq6bNqde20p.xml
├── BT5hWoz-UTefONdqForZyI91O8Yd.xml
├── BT5hWoz-UTefONdqForZyI91O8Yp.xml
├── KocSmEw1PpelhlG7ZNeMUdHVtywd.xml
├── KocSmEw1PpelhlG7ZNeMUdHVtywp.xml
├── QMJD9OLFzxcTTbPOoh-ahQ4zTRUd.xml
├── QMJD9OLFzxcTTbPOoh-ahQ4zTRUp.xml
├── ZN2RlSIbyWXhOxbxxI4hOawbMD4d.xml
├── ZN2RlSIbyWXhOxbxxI4hOawbMD4p.xml
├── ZdVxxv9BsNz7MGUxtEc6Pq3qh1Md.xml
├── ZdVxxv9BsNz7MGUxtEc6Pq3qh1Mp.xml
├── iMwdHOXOBiBXhnA_li8gtEJVTjcd.xml
├── iMwdHOXOBiBXhnA_li8gtEJVTjcp.xml
├── rh0jHbNfmojECiiHH7BQHmZTsWkd.xml
├── rh0jHbNfmojECiiHH7BQHmZTsWkp.xml
├── rnpMu7jn2QWt_rQcz8FJ-MxGzVId.xml
└── rnpMu7jn2QWt_rQcz8FJ-MxGzVIp.xml
├── root
├── 6x1BhZX_fLnKpcwqra0qFwv1jIgp.xml
├── 6xhH2l9GP9loT6TdFn_Mo65sDHgp.xml
├── EEtUlUb-dLAdf0KpMVivaUlztwAp.xml
├── GiiBklLgTxteCEmomM8RCvWT0nQd.xml
├── GiiBklLgTxteCEmomM8RCvWT0nQp.xml
├── HoHDHQ_WvHAAKj5aJOrvrg_vpt8p.xml
├── KAXfQgCar2Yb8zOxgvf9hdmLP1Ep.xml
├── NmGqIpAwUJcXFyLjFAGnU9uyN5Yp.xml
├── WZRuNzqc-Db7NcQAZO8Y-R8U9ccp.xml
├── fjRQtWiSIy7hIlj-Kmk87M7s21kp.xml
└── qaw0eS1zuuY1ar9TdPn1GMfrjbQp.xml
├── rootp.xml
├── uuid-366ca619-578a-4bc0-8012-bfa62d28c37f.xml
└── uuid-47fbbcc6-62c4-483f-9ecf-91b5909f408e.xml
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.fig binary
2 | *.mat binary
3 | *.mdl binary diff merge=mlAutoMerge
4 | *.mdlp binary
5 | *.mexa64 binary
6 | *.mexw64 binary
7 | *.mexmaci64 binary
8 | *.mlapp binary linguist-language=MATLAB
9 | *.mldatx binary
10 | *.mlproj binary
11 | *.mlx binary merge=mlAutoMerge linguist-language=MATLAB
12 | *.p binary
13 | *.sfx binary
14 | *.sldd binary
15 | *.slreqx binary merge=mlAutoMerge
16 | *.slmx binary merge=mlAutoMerge
17 | *.sltx binary
18 | *.slxc binary
19 | *.slx binary merge=mlAutoMerge linguist-language=Simulink
20 | *.slxp binary
21 |
22 | ## Other common binary file types
23 | *.docx binary
24 | *.exe binary
25 | *.jpg binary
26 | *.pdf binary
27 | *.png binary
28 | *.xlsx binary
29 |
30 | # Ignore HTML
31 |
32 | *.html linguist-detectable=false
33 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: MATLAB Build
2 |
3 | # Controls when the action will run.
4 | on:
5 | push:
6 | branches: [ release ]
7 | pull_request:
8 | branches: [ release ]
9 | workflow_dispatch:
10 |
11 | # Add permission to write GitHub pages
12 | permissions:
13 | contents: write
14 | pages: write
15 | id-token: write
16 |
17 | jobs:
18 | test:
19 | strategy:
20 | fail-fast: false
21 | matrix:
22 | MATLABVersion: [R2024a,R2024b]
23 | runs-on: ubuntu-latest
24 | steps:
25 | # Checks-out your repository
26 | - uses: actions/checkout@v4
27 |
28 | # Sets up a display server
29 | - name: Start display server
30 | if: ${{ always() }}
31 | run: |
32 | sudo apt-get install xvfb
33 | Xvfb :99 &
34 | echo "DISPLAY=:99" >> $GITHUB_ENV
35 |
36 | # Sets up MATLAB
37 | - name: Setup MATLAB
38 | uses: matlab-actions/setup-matlab@v2
39 | with:
40 | release: ${{ matrix.MATLABVersion }}
41 | products: >
42 | Signal_Processing_Toolbox
43 | Deep_Learning_Toolbox
44 | Image_Processing_Toolbox
45 | Deep_Learning_Toolbox_Model_for_AlexNet_Network
46 |
47 | # Run all the tests
48 | - name: Run SmokeTests
49 | uses: matlab-actions/run-command@v2
50 | with:
51 | command: openProject(pwd); RunAllTests;
52 |
53 | # Upload the test results as artifact
54 | - name: Upload TestResults
55 | uses: actions/upload-artifact@v4
56 | with:
57 | name: TestResults_${{ matrix.MATLABVersion }}
58 | path: ./public/*
59 | overwrite: true
60 |
61 | badge:
62 | if: ${{ always() }}
63 | needs: [test]
64 | strategy:
65 | fail-fast: false
66 | runs-on: ubuntu-latest
67 | steps:
68 |
69 | # Checks-out your repository
70 | - uses: actions/checkout@v4
71 |
72 | # Sets up R2023b
73 | - name: Setup MATLAB
74 | uses: matlab-actions/setup-matlab@v2
75 | with:
76 | release: R2024b
77 |
78 | # Download the test results from artifact
79 | - name: Download All TestResults
80 | uses: actions/download-artifact@v4
81 | with:
82 | path: public
83 | pattern: TestResults_*
84 | merge-multiple: true
85 |
86 | # Create the test results badge
87 | - name: Run PostSmokeTest
88 | uses: matlab-actions/run-command@v2
89 | with:
90 | command: openProject(pwd); PostSmokeTest;
91 |
92 | # Deploy reports to GitHub pages
93 | - name: Setup Pages
94 | uses: actions/configure-pages@v5
95 | - name: Upload pages artifact
96 | uses: actions/upload-pages-artifact@v3
97 | with:
98 | path: public
99 | - name: Deploy to GitHub Pages
100 | id: deployment
101 | uses: actions/deploy-pages@v4
102 |
103 | # Commit the JSON for the MATLAB releases badge
104 | - name: Commit changed files
105 | continue-on-error: true
106 | run: |
107 | git config user.name "${{ github.workflow }} by ${{ github.actor }}"
108 | git config user.email "<>"
109 | git pull
110 | git add Images/TestedWith.json
111 | git commit Images/TestedWith.json -m "Update CI badges ${{ github.ref_name }}"
112 | git fetch
113 | git push
114 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # List of untracked files to ignore
2 |
3 | # Autosave files
4 | *.asv
5 | *.m~
6 | *.autosave
7 | *.slx.r*
8 | *.mdl.r*
9 |
10 | # MATLAB Drive
11 | *.MATLABDriveTag
12 |
13 | # Compiled files
14 | *.mex*
15 | *.p
16 |
17 | # Compressed files
18 | *.zip
19 |
20 | # Packaged app and toolbox files
21 | *.mlappinstall
22 | *.mltbx
23 |
24 | # Deployable archives
25 | *.ctf
26 |
27 | # Generated helpsearch folders
28 | helpsearch*/
29 |
30 | # Defined Simulink cache folder
31 | Utilities/SimulinkCache/*
32 |
33 | # Standard code generation folders
34 | slprj/
35 | sccprj/
36 | codegen/
37 |
38 | # Code generation file
39 | *.eep
40 | *.elf
41 | *.hex
42 | *.bin
43 |
44 | # Cache files
45 | *.slxc
46 |
47 | # Project settings
48 | Utilities/ProjectSettings.mat
49 |
50 | # GitLab page folder
51 | public/
--------------------------------------------------------------------------------
/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | stages:
2 | # Set up two testing paths
3 | - setup
4 | - test
5 | - deploy
6 | - release
7 |
8 | setup-job:
9 | tags:
10 | - matlab
11 | stage: setup
12 | script:
13 | - cd ..
14 | - if (test-path utilities) { rm -r -force utilities }
15 | - git clone git@insidelabs-git.mathworks.com:modular-curriculum-content/utilities.git
16 | - cd $CI_PROJECT_NAME
17 | allow_failure: false
18 |
19 |
20 | smoke-test:
21 | # Smoke tests should run all the time
22 | tags:
23 | # Add additional tags like (e.g. - arduino) as required
24 | # Make sure that the runner you plan to use matches the tags
25 | - matlab
26 | stage: test
27 | parallel:
28 | matrix:
29 | - VERSION: [R2024a,R2024b]
30 | script:
31 | - Set-Alias -Name matlab -Value "C:\Program Files\MATLAB\$VERSION\bin\matlab.exe"
32 | - matlab -batch "openProject(pwd);RunAllTests"
33 | when: always
34 | allow_failure: true
35 | artifacts:
36 | name: "$VERSION"
37 | paths:
38 | - public/*
39 | when: always
40 |
41 |
42 | pages:
43 | tags:
44 | - matlab
45 | stage: deploy
46 | script:
47 | - matlab -batch "openProject(pwd);PostSmokeTest;"
48 | artifacts:
49 | paths:
50 | - public
51 |
52 | file-test:
53 | tags:
54 | - matlab
55 | stage: release
56 | script:
57 | - matlab -batch "proj = openProject(pwd);
58 | addpath(proj.RootFolder+'/InternalFiles/Tests/CI');
59 | results = runtests('OpenCloseFileTest.m');
60 | disp(table(results)); assertSuccess(results);"
61 | rules:
62 | # This test should always run when merging to main
63 | # And be available for manual running on any push
64 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
65 | when: always
66 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
67 | when: manual
68 | allow_failure: true
69 |
70 | release-testing:
71 | tags:
72 | - matlab
73 | stage: release
74 | script:
75 | - matlab -batch "proj = openProject(pwd);
76 | cd ..;
77 | addpath(genpath(fullfile('utilities','TestingResources')));
78 | addpath(genpath(fullfile('utilities','Tools')));
79 | runCMTests"
80 | rules:
81 | # This test should always run when merging to main
82 | # And be available for manual running on any push
83 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
84 | when: always
85 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
86 | when: manual
87 | allow_failure: true
88 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | >_If you believe you have discovered a security vulnerability, please **do not** open an issue or make a pull request. Follow the instructions in the [SECURITY.md](SECURITY.md) file in this repository._
4 |
5 | Thank you for your interest in contributing to a MathWorks repository! We encourage contributions large and small to this repository.
6 |
7 | **Contributions do not have to be code!** If you see a way to explain things more clearly or a great example of how to use something, please contribute it (or a link to your content). We welcome issues even if you don't code the solution. We also welcome pull requests to resolve issues that we haven't gotten to yet!
8 |
9 | ## How to give feedback
10 | * **Send us an email:** Contact the [MathWorks teaching resources team.](mailto:onlineteaching@mathworks.com)
11 | * **Open an issue:** Start by [creating an issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue) in the repository that you're interested in. That will start a conversation with the maintainer. When you are creating a bug report, please include as many details as possible. Please remember that other people do not have your background or understanding of the issue; make sure you are clear and complete in your description.
12 |
13 | ## How to contribute to the repository
14 | * **Work in your own public fork:** If you choose to make a contribution, you should [fork the repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo). This creates an editable copy on GitHub where you can write, test, and refine your changes. We suggest that you keep your changes small and focused on the issue you submitted.
15 | * **Sign a Contributor License Agreement (CLA):** We require that all outside contributors sign a [CLA](https://en.wikipedia.org/wiki/Contributor_License_Agreement) before we can accept your contribution. When you create a pull request (see below), we'll reach out to you if you do not already have one on file. Essentially, the CLA gives us permission to publish your contribution as part of the repository.
16 | * **Make a pull request:** "[Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)" is a confusing term, but it means exactly what it says: You're requesting that the maintainers of the repository pull your changes in. If you don't have a CLA on file, we'll reach out to you. Your contribution will be reviewed, and we may ask you to revise your pull request based on our feedback. Once everyone is satisfied, we'll merge your pull request into the repository.
17 |
18 | ## Guidelines
19 |
20 | We don't have best practices for writing MATLAB® code, but we do have some recommendations:
21 |
22 | * You should not have any warnings or errors in the [code analyzer report](http://www.mathworks.com/help/matlab/matlab_prog/matlab-code-analyzer-report.html)
23 | * [Loren Shure's blog](https://blogs.mathworks.com/loren) has [great advice on improving your MATLAB code](https://blogs.mathworks.com/loren/category/best-practice/)
24 | * Examples should be written as [live scripts](https://www.mathworks.com/help/matlab/matlab_prog/what-is-a-live-script-or-function.html) or [Simulink® models](https://www.mathworks.com/help/simulink/index.html).
25 | * We adhere to the [CommonMark](https://commonmark.org/) specification where it does not conflict with GitHub rendering. If you edit your Markdown in Visual Studio Code or a similar editor, it uses [markdownlint](https://github.com/DavidAnson/markdownlint) to highlight issues in your Markdown.
26 |
27 | **Again, thanks for contributing, and we look forward to your issues and pull requests!**
28 |
--------------------------------------------------------------------------------
/Convolution.prj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Data/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Data/.gitkeep
--------------------------------------------------------------------------------
/Data/1st_baptist_nashville_balcony.rights:
--------------------------------------------------------------------------------
1 | Creative Commons Attribution 4.0 International Public License
2 | By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
3 |
4 | Section 1 – Definitions.
5 |
6 | Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
7 | Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
8 | Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
9 | Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
10 | Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
11 | Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
12 | Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
13 | Licensor means the individual(s) or entity(ies) granting rights under this Public License.
14 | Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
15 | Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
16 | You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
17 | Section 2 – Scope.
18 |
19 | License grant.
20 | Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
21 | reproduce and Share the Licensed Material, in whole or in part; and
22 | produce, reproduce, and Share Adapted Material.
23 | Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
24 | Term. The term of this Public License is specified in Section 6(a).
25 | Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
26 | Downstream recipients.
27 | Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
28 | No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
29 | No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
30 | Other rights.
31 |
32 | Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
33 | Patent and trademark rights are not licensed under this Public License.
34 | To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
35 | Section 3 – License Conditions.
36 |
37 | Your exercise of the Licensed Rights is expressly made subject to the following conditions.
38 |
39 | Attribution.
40 |
41 | If You Share the Licensed Material (including in modified form), You must:
42 |
43 | retain the following if it is supplied by the Licensor with the Licensed Material:
44 | identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
45 | a copyright notice;
46 | a notice that refers to this Public License;
47 | a notice that refers to the disclaimer of warranties;
48 | a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
49 | indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
50 | indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
51 | You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
52 | If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
53 | If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.
54 | Section 4 – Sui Generis Database Rights.
55 |
56 | Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
57 |
58 | for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
59 | if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and
60 | You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
61 | For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
62 | Section 5 – Disclaimer of Warranties and Limitation of Liability.
63 |
64 | Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
65 | To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
66 | The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
67 | Section 6 – Term and Termination.
68 |
69 | This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
70 | Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
71 |
72 | automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
73 | upon express reinstatement by the Licensor.
74 | For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
75 | For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
76 | Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
77 | Section 7 – Other Terms and Conditions.
78 |
79 | The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
80 | Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
81 | Section 8 – Interpretation.
82 |
83 | For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
84 | To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
85 | No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
86 | Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
--------------------------------------------------------------------------------
/Data/1st_baptist_nashville_balcony.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Data/1st_baptist_nashville_balcony.wav
--------------------------------------------------------------------------------
/Data/flower.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Data/flower.jpg
--------------------------------------------------------------------------------
/Data/lettert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Data/lettert.png
--------------------------------------------------------------------------------
/Data/ringtone.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Data/ringtone.wav
--------------------------------------------------------------------------------
/Images/AddOnsIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/AddOnsIcon.png
--------------------------------------------------------------------------------
/Images/BasicConvolutionPLot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/BasicConvolutionPLot.png
--------------------------------------------------------------------------------
/Images/Conv1D.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/Conv1D.gif
--------------------------------------------------------------------------------
/Images/Conv2D.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/Conv2D.gif
--------------------------------------------------------------------------------
/Images/DilationAnimation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/DilationAnimation.gif
--------------------------------------------------------------------------------
/Images/EmbossedRose.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/EmbossedRose.png
--------------------------------------------------------------------------------
/Images/EndIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/EndIcon.png
--------------------------------------------------------------------------------
/Images/LTIPlot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/LTIPlot.png
--------------------------------------------------------------------------------
/Images/OpenInFX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/OpenInFX.png
--------------------------------------------------------------------------------
/Images/OpenInMO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/OpenInMO.png
--------------------------------------------------------------------------------
/Images/TestedWith.json:
--------------------------------------------------------------------------------
1 | {"schemaVersion":1,"label":"Tested with","color":"success","message":"R2024a | R2024b"}
2 |
--------------------------------------------------------------------------------
/Images/image_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Images/image_9.png
--------------------------------------------------------------------------------
/InstructorResources/Solutions/ConvolutionBasicsSoln.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/InstructorResources/Solutions/ConvolutionBasicsSoln.mlx
--------------------------------------------------------------------------------
/InstructorResources/Solutions/ConvolutionFiltersSoln.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/InstructorResources/Solutions/ConvolutionFiltersSoln.mlx
--------------------------------------------------------------------------------
/InstructorResources/Solutions/ConvolutionLTISoln.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/InstructorResources/Solutions/ConvolutionLTISoln.mlx
--------------------------------------------------------------------------------
/InstructorResources/Solutions/PracticeProblemsSoln.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/InstructorResources/Solutions/PracticeProblemsSoln.mlx
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Copyright (c) 2023, The MathWorks, Inc.
2 | All rights reserved.
3 |
4 | Redistribution and use in source and binary forms, with or without
5 | modification, are permitted provided that the following conditions are
6 | met:
7 |
8 | * Redistributions of source code must retain the above copyright
9 | notice, this list of conditions and the following disclaimer.
10 | * Redistributions in binary form must reproduce the above copyright
11 | notice, this list of conditions and the following disclaimer in
12 | the documentation and/or other materials provided with the distribution
13 | * Neither the name of the The MathWorks, Inc. nor the names
14 | of its contributors may be used to endorse or promote products derived
15 | from this software without specific prior written permission.
16 |
17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 | POSSIBILITY OF SUCH DAMAGE.
28 |
--------------------------------------------------------------------------------
/MainMenu.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/MainMenu.mlx
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Convolution in Digital Signal Processing
3 |
4 |
5 | [](https://www.mathworks.com/matlabcentral/fileexchange/97112-convolution-in-digital-signal-processing) or [](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing&project=Convolution.prj&file=README.mlx)
6 |
7 | [](https://MathWorks-Teaching-Resources.github.io/Convolution-Digital-Signal-Processing)
8 |
9 | **Curriculum Module**
10 |
11 | _Created with R2024a. Compatible with R2024a and later releases._
12 |
13 | # Information
14 |
15 | This curriculum module contains interactive [MATLAB® live scripts](https://www.mathworks.com/products/matlab/live-editor.html) and supporting data files centered around the fundamentals of convolution in digital signal processing.
16 |
17 |
18 | ## Background
19 |
20 | You can use these live scripts as demonstrations in lectures, class activities, or interactive assignments outside class. This module covers the definition and computation of 1D and 2D convolution, as well as the concepts of linear time invariant systems and filtering. It also includes examples of audio and image manipulation using convolution.
21 |
22 |
23 | The instructions inside the live scripts will guide you through the exercises and activities. Get started with each live script by running it one section at a time. To stop running the script or a section midway (for example, when an animation is in progress), use the
Stop button in the **RUN** section of the **Live Editor** tab in the MATLAB Toolstrip.
24 |
25 | ## Contact Us
26 |
27 | Solutions are available upon instructor request. Contact the [MathWorks teaching resources team](mailto:onlineteaching@mathworks.com) if you would like to request solutions, provide feedback, or if you have a question.
28 |
29 |
30 | ## Prerequisites
31 |
32 | This module assumes knowledge of MATLAB at the level of the [MATLAB Onramp](https://matlabacademy.mathworks.com/details/matlab-onramp/gettingstarted) – a free two\-hour introductory tutorial that teaches the essentials of MATLAB.
33 |
34 |
35 | ## Getting Started
36 | ### Accessing the Module
37 | ### **On MATLAB Online:**
38 |
39 | Use the [
](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing&project=Convolution.prj) link to download the module. You will be prompted to log in or create a MathWorks account. The project will be loaded, and you will see an app with several navigation options to get you started.
40 |
41 | ### **On Desktop:**
42 |
43 | Download or clone this repository. Open MATLAB, navigate to the folder containing these scripts and double\-click on [Convolution.prj](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing&project=Convolution.prj&file=README.mlx). It will add the appropriate files to your MATLAB path and open an app that asks you where you would like to start.
44 |
45 |
46 | Ensure you have all the required products (listed below) installed. If you need to include a product, add it using the Add\-On Explorer. To install an add\-on, go to the **Home** tab and select
**Add-Ons** > **Get Add-Ons**.
47 |
48 |
49 | ## Products
50 |
51 | MATLAB® and the Signal Processing Toolbox™ are used throughout. To run all of the examples in ConvolutionFilters.mlx requires the Image Processing Toolbox™ and the Deep Learning Toolbox™, including the Deep Learning Toolbox Model for AlexNet Network support package.
52 |
53 | # Scripts
54 | ## [**ConvolutionBasics.mlx**](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing&project=Convolution.prj&file=Scripts/ConvolutionBasics.mlx)
55 | | | |
56 | | :-- | :-- |
57 | | | **In this script, students will...**
|
58 | |
| $\bullet$ define and compute convolution of two 1\-D signals
$\bullet$ use FFT to compute convolution
$\bullet$ define and compute circular convolution
$\bullet$ achieve equivalence between circular and linear convolution
|
59 | | | |
60 |
61 | ## [**ConvolutionLTI.mlx**](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing&project=Convolution.prj&file=Scripts/ConvolutionLTI.mlx)
62 | | | | |
63 | | :-- | :-- | :-- |
64 | | | **In this script, students will...**
| **Application**
|
65 | |
| $\bullet$ define a linear time invariant (LTI) system
$\bullet$ identify the moving average operation as a simple LTI system
$\bullet$ compute the output of an LTI system for an arbitrary input signal given its impulse response
| $\bullet$ Transform a monophone signal to two channel stereo with reverberation
|
66 | | | | |
67 |
68 | ## [**ConvolutionFilters.mlx**](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing&project=Convolution.prj&file=Scripts/ConvolutionFilters.mlx)
69 | | | | |
70 | | :-- | :-- | :-- |
71 | | | **In this script, students will...**
| **Applications**
|
72 | |
| $\bullet$ explain the frequency domain implications of convolving two signals in the time domain
$\bullet$ achieve equivalence between low pass filtering and convolution
$\bullet$ define and compute convolution of two 2\-D signals
$\bullet$ perform spatial filtering of images to achieve effects such as blurring and embossing
| $\bullet$ Blurring images
$\bullet$ Sharpening images
$\bullet$ Using convolution to identify parts of an image
$\bullet$ Using pretrained convolutional neural network to identify images
|
73 | | | | |
74 |
75 | ## [**PracticeProblems.mlx**](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing&project=Convolution.prj&file=Scripts/PracticeProblems.mlx)
76 | # Related Courseware Modules
77 | | | | |
78 | | :-- | :-- | :-- |
79 | | **Courseware Module**
| **Sample Content**
| **Available on:**
|
80 | | [**Binary Morphology in Image Processing**](https://www.mathworks.com/matlabcentral/fileexchange/94590-binary-morphology-in-image-processing)
|
| [
](https://www.mathworks.com/matlabcentral/fileexchange/94590-binary-morphology-in-image-processing)
[
](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Morphology-in-Image-Processing&project=Morphology.prj)
[GitHub](https://github.com/MathWorks-Teaching-Resources/Morphology-in-Image-Processing)
|
81 | | [**Climate Data Visualization and Analysis**](https://www.mathworks.com/matlabcentral/fileexchange/110125-climate-data-visualization-and-analysis)
|
| [
](https://www.mathworks.com/matlabcentral/fileexchange/110125-climate-data-visualization-and-analysis)
[
](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Climate-Data-Visualization-and-Analysis&project=ClimateVis.prj)
[GitHub](https://github.com/MathWorks-Teaching-Resources/Climate-Data-Visualization-and-Analysis)
|
82 | | | | |
83 |
84 |
85 | Or feel free to explore our other [modular courseware content](https://www.mathworks.com/matlabcentral/fileexchange/?q=tag%3A%22courseware+module%22&sort=downloads_desc_30d).
86 |
87 | # Educator Resources
88 | - [Educator Page](https://www.mathworks.com/academia/educators.html)
89 |
90 | # Contribute
91 |
92 | Looking for more? Find an issue? Have a suggestion? Please contact the [MathWorks teaching resources team](mailto:%20onlineteaching@mathworks.com). If you want to contribute directly to this project, you can find information about how to do so in the [CONTRIBUTING.md](https://github.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/blob/release/CONTRIBUTING.md) page on GitHub.
93 |
94 |
95 | *©* Copyright 2023 The MathWorks™, Inc
96 |
97 |
98 |
--------------------------------------------------------------------------------
/README.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/README.mlx
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Reporting Security Vulnerabilities
2 |
3 | If you believe you have discovered a security vulnerability, please report it to
4 | [security@mathworks.com](mailto:security@mathworks.com). Please see
5 | [MathWorks Vulnerability Disclosure Policy for Security Researchers](https://www.mathworks.com/company/aboutus/policies_statements/vulnerability-disclosure-policy.html)
6 | for additional information.
--------------------------------------------------------------------------------
/Scripts/ConvolutionBasics.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Scripts/ConvolutionBasics.mlx
--------------------------------------------------------------------------------
/Scripts/ConvolutionFilters.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Scripts/ConvolutionFilters.mlx
--------------------------------------------------------------------------------
/Scripts/ConvolutionLTI.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Scripts/ConvolutionLTI.mlx
--------------------------------------------------------------------------------
/Scripts/PracticeProblems.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Scripts/PracticeProblems.mlx
--------------------------------------------------------------------------------
/SoftwareTests/CheckTestResults.m:
--------------------------------------------------------------------------------
1 | classdef CheckTestResults < matlab.unittest.TestCase
2 |
3 | properties (SetAccess = protected)
4 | end
5 |
6 | properties (ClassSetupParameter)
7 | Project = {currentProject()};
8 | end
9 |
10 | properties (TestParameter)
11 | Version
12 | end
13 |
14 |
15 | methods (TestParameterDefinition,Static)
16 |
17 | function Version = GetResults(Project)
18 | RootFolder = Project.RootFolder;
19 | Version = dir(fullfile(RootFolder,"public","TestResults*.txt"));
20 | Version = extractBetween([Version.name],"TestResults_",".txt");
21 | end
22 |
23 | end
24 |
25 | methods (TestClassSetup)
26 |
27 | function SetUpSmokeTest(testCase,Project)
28 | try
29 | currentProject;
30 | catch
31 | error("Project is not loaded.")
32 | end
33 | end
34 |
35 | end
36 |
37 | methods(Test)
38 |
39 | function CheckResults(testCase,Version)
40 | File = fullfile("public","TestResults_"+Version+".txt");
41 | Results = readtable(File,TextType="string");
42 | if ~all(Results.Passed)
43 | error("Some of the tests did not pass.")
44 | end
45 | end
46 |
47 | end
48 |
49 | end
--------------------------------------------------------------------------------
/SoftwareTests/CreateBadge.m:
--------------------------------------------------------------------------------
1 | % Create the test suite with SmokeTest and Function test if they exist
2 | Suite = testsuite("CheckTestResults");
3 |
4 | % Create a runner with no plugins
5 | Runner = matlab.unittest.TestRunner.withNoPlugins;
6 |
7 | % Run the test suite
8 | Results = Runner.run(Suite);
9 |
10 | % Format the results in a table and save them
11 | Results = table(Results');
12 | Results = Results(Results.Passed,:);
13 | Version = extractBetween(string(Results.Name),"Version=",")");
14 |
15 |
16 | % Format the JSON file
17 | Badge = struct;
18 | Badge.schemaVersion = 1;
19 | Badge.label = "Tested with";
20 | if size(Results,1) >= 1
21 | Badge.color = "success"
22 | Badge.message = join(Version," | ");
23 | else
24 | Badge.color = "failure";
25 | Badge.message = "Pipeline fails";
26 | end
27 | Badge = jsonencode(Badge);
28 | writelines(Badge,fullfile("Images","TestedWith.json"));
--------------------------------------------------------------------------------
/SoftwareTests/FunctionTests.m:
--------------------------------------------------------------------------------
1 | classdef FunctionTests < matlab.unittest.TestCase
2 |
3 | % https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html
4 |
5 | methods(Test)
6 |
7 | end % methods
8 |
9 | end % classdef
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostConvolutionBasics.m:
--------------------------------------------------------------------------------
1 | % Post-run script for ConvolutionBasics.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostConvolutionBasicsSoln.m:
--------------------------------------------------------------------------------
1 | % Post-run script for ConvolutionBasicsSoln.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostConvolutionFilters.m:
--------------------------------------------------------------------------------
1 | % Post-run script for ConvolutionFilters.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostConvolutionFiltersSoln.m:
--------------------------------------------------------------------------------
1 | % Post-run script for ConvolutionFiltersSoln.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostConvolutionLTI.m:
--------------------------------------------------------------------------------
1 | % Post-run script for ConvolutionLTI.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostConvolutionLTISoln.m:
--------------------------------------------------------------------------------
1 | % Post-run script for ConvolutionLTISoln.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostPracticeProblemSolns.m:
--------------------------------------------------------------------------------
1 | % Post-run script for PracticeProblemSolns.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostFiles/PostPracticeProblemSolnsSoln.m:
--------------------------------------------------------------------------------
1 | % Post-run script for PracticeProblemSolnsSoln.mlx
2 | % ---- Post-run commands -----
3 |
4 |
--------------------------------------------------------------------------------
/SoftwareTests/PostSmokeTest.m:
--------------------------------------------------------------------------------
1 | function PostSmokeTest(ShowReport)
2 | arguments
3 | ShowReport (1,1) logical = false;
4 | end
5 |
6 | import matlab.unittest.plugins.TestRunnerPlugin;
7 |
8 | % Create the runner:
9 | Runner = matlab.unittest.TestRunner.withTextOutput;
10 |
11 | % Create report folder:
12 | Folder = fullfile(currentProject().RootFolder,"public");
13 | if ~isfolder(Folder)
14 | mkdir(Folder)
15 | end
16 |
17 | % Add HTML plugin:
18 | Plugin = matlab.unittest.plugins.TestReportPlugin.producingHTML(Folder,...
19 | "IncludingPassingDiagnostics",true,...
20 | "IncludingCommandWindowText",false,...
21 | "LoggingLevel",matlab.automation.Verbosity(1));
22 | Runner.addPlugin(Plugin);
23 |
24 |
25 | % Create Test Suite
26 | Suite = testsuite("CheckTestResults");
27 |
28 | % Run the test suite
29 | Results = Runner.run(Suite);
30 |
31 |
32 | % Format the results in a table and save them
33 | Results = table(Results');
34 | Results = Results(Results.Passed,:);
35 | Version = extractBetween(string(Results.Name),"Version=",")");
36 |
37 | % Add link to other report
38 | File = fileread(fullfile("public","index.html"));
39 | for iVer = 1:length(Version)
40 | File = replace(File,"Version="+Version(iVer),...
41 | sprintf('%s',Version(iVer),"Version="+Version(iVer)));
42 | end
43 | writelines(File,fullfile("public","index.html"),"WriteMode","overwrite");
44 |
45 | % Format the JSON file
46 | Badge = struct;
47 | Badge.schemaVersion = 1;
48 | Badge.label = "Tested with";
49 | if size(Results,1) >= 1
50 | Badge.color = "success"
51 | Badge.message = join("R"+Version," | ");
52 | else
53 | Badge.color = "failure";
54 | Badge.message = "Pipeline fails";
55 | end
56 | Badge = jsonencode(Badge);
57 | writelines(Badge,fullfile("Images","TestedWith.json"));
58 |
59 | if ShowReport
60 | web(fullfile(Folder,"index.html"))
61 | end
62 |
63 | end
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PreConvolutionBasics.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for ConvolutionBasics.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PreConvolutionBasicsSoln.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for ConvolutionBasicsSoln.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PreConvolutionFilters.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for ConvolutionFilters.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PreConvolutionFiltersSoln.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for ConvolutionFiltersSoln.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PreConvolutionLTI.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for ConvolutionLTI.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PreConvolutionLTISoln.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for ConvolutionLTISoln.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PrePracticeProblemSolns.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for PracticeProblemSolns.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/PreFiles/PrePracticeProblemSolnsSoln.m:
--------------------------------------------------------------------------------
1 | % Pre-run script for PracticeProblemSolnsSoln.mlx
2 | % ---- Known Issues -----
3 | KnownIssuesID = "";
4 | % ---- Pre-run commands -----
5 |
6 |
--------------------------------------------------------------------------------
/SoftwareTests/RunAllTests.m:
--------------------------------------------------------------------------------
1 | function RunAllTests(ShowReport)
2 | arguments
3 | ShowReport (1,1) logical = false;
4 | end
5 |
6 | import matlab.unittest.plugins.TestReportPlugin;
7 |
8 | % Create a runner
9 | Runner = matlab.unittest.TestRunner.withTextOutput;
10 | Folder = fullfile(currentProject().RootFolder,"public",version("-release"));
11 | if ~isfolder(Folder)
12 | mkdir(Folder)
13 | else
14 | rmdir(Folder,'s')
15 | mkdir(Folder)
16 | end
17 | Plugin = TestReportPlugin.producingHTML(Folder,...
18 | "IncludingPassingDiagnostics",true,...
19 | "IncludingCommandWindowText",true,...
20 | "LoggingLevel",matlab.automation.Verbosity(1));
21 | Runner.addPlugin(Plugin);
22 |
23 |
24 | % Create the test suite with SmokeTest and Function test if they exist
25 | Suite = testsuite("SmokeTests");
26 | Suite = [Suite testsuite("FunctionTests")];
27 | Suite = [Suite testsuite("SolnSmokeTests")];
28 |
29 | % Run the test suite
30 | Results = Runner.run(Suite);
31 |
32 | if ShowReport
33 | web(fullfile(Folder,"index.html"))
34 | end
35 |
36 | % Format the results in a table and save them
37 | ResultsTable = table(Results')
38 | writetable(ResultsTable,fullfile(currentProject().RootFolder,...
39 | "public","TestResults_"+version("-release")+".txt"));
40 |
41 | % Assert success of test
42 | assertSuccess(Results);
43 |
44 | end
45 |
--------------------------------------------------------------------------------
/SoftwareTests/SmokeTests.m:
--------------------------------------------------------------------------------
1 | classdef SmokeTests < matlab.unittest.TestCase
2 |
3 | properties
4 | RootFolder
5 | end
6 |
7 | properties (ClassSetupParameter)
8 | Project = {currentProject()};
9 | end
10 |
11 | properties (TestParameter)
12 | File;
13 | end
14 |
15 | methods (TestParameterDefinition,Static)
16 |
17 | function File = RetrieveFile(Project) %#ok
18 | % Retrieve student template files:
19 | RootFolder = currentProject().RootFolder;
20 | File = dir(fullfile(RootFolder,"Scripts","*.mlx"));
21 | File = {File.name};
22 | end
23 |
24 | end
25 |
26 | methods (TestClassSetup)
27 |
28 | function SetUpSmokeTest(testCase,Project) %#ok
29 | % Navigate to project root folder:
30 | testCase.RootFolder = Project.RootFolder;
31 | cd(testCase.RootFolder)
32 |
33 | % Close the StartUp app if still open:
34 | delete(findall(groot,'Name','StartUp App'))
35 |
36 | % Log MATLAB version:
37 | testCase.log("Running in " + version)
38 | end
39 |
40 | end
41 |
42 | methods(Test)
43 |
44 | function SmokeRun(testCase,File)
45 |
46 | % Navigate to project root folder:
47 | cd(testCase.RootFolder)
48 | FileToRun = string(File);
49 |
50 | % Pre-test:
51 | PreFiles = CheckPreFile(testCase,FileToRun);
52 | run(PreFiles);
53 |
54 | % Run SmokeTest
55 | disp(">> Running " + FileToRun);
56 | try
57 | run(fullfile("Scripts",FileToRun));
58 | catch ME
59 |
60 | end
61 |
62 | % Post-test:
63 | PostFiles = CheckPostFile(testCase,FileToRun);
64 | run(PostFiles)
65 |
66 | % Log every figure created during run:
67 | Figures = findall(groot,'Type','figure');
68 | Figures = flipud(Figures);
69 | if ~isempty(Figures)
70 | for f = 1:size(Figures,1)
71 | if ~isempty(Figures(f).Number)
72 | FigDiag = matlab.unittest.diagnostics.FigureDiagnostic(Figures(f),'Formats','png');
73 | log(testCase,1,FigDiag);
74 | end
75 | end
76 | end
77 |
78 | % Close all figures and Simulink models
79 | close all force
80 | if any(matlab.addons.installedAddons().Name == "Simulink")
81 | bdclose all
82 | end
83 |
84 | % Rethrow error if any
85 | if exist("ME","var")
86 | if ~any(strcmp(ME.identifier,KnownIssuesID))
87 | rethrow(ME)
88 | end
89 | end
90 |
91 | end
92 |
93 | end
94 |
95 |
96 | methods (Access = private)
97 |
98 | function Path = CheckPreFile(testCase,Filename)
99 | PreFile = "Pre"+replace(Filename,".mlx",".m");
100 | PreFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PreFiles",PreFile);
101 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles"))
102 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles"))
103 | end
104 | if ~isfile(PreFilePath)
105 | writelines("% Pre-run script for "+Filename,PreFilePath)
106 | writelines("% ---- Known Issues -----",PreFilePath,'WriteMode','append');
107 | writelines("KnownIssuesID = "+char(34)+char(34)+";",PreFilePath,'WriteMode','append');
108 | writelines("% ---- Pre-run commands -----",PreFilePath,'WriteMode','append');
109 | writelines(" ",PreFilePath,'WriteMode','append');
110 | end
111 | Path = PreFilePath;
112 | end
113 |
114 | function Path = CheckPostFile(testCase,Filename)
115 | PostFile = "Post"+replace(Filename,".mlx",".m");
116 | PostFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PostFiles",PostFile);
117 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles"))
118 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles"))
119 | end
120 | if ~isfile(PostFilePath)
121 | writelines("% Post-run script for "+Filename,PostFilePath)
122 | writelines("% ---- Post-run commands -----",PostFilePath,'WriteMode','append');
123 | writelines(" ",PostFilePath,'WriteMode','append');
124 | end
125 | Path = PostFilePath;
126 | end
127 |
128 | end
129 |
130 | end
--------------------------------------------------------------------------------
/SoftwareTests/SolnSmokeTests.m:
--------------------------------------------------------------------------------
1 | classdef SolnSmokeTests < matlab.unittest.TestCase
2 |
3 | properties
4 | RootFolder
5 | isSolnOnPath
6 | end
7 |
8 | properties (ClassSetupParameter)
9 | Project = {currentProject()};
10 | end
11 |
12 | properties (TestParameter)
13 | File;
14 | end
15 |
16 | methods (TestParameterDefinition,Static)
17 |
18 | function File = GetScriptName(Project)
19 | % Retrieve student template files:
20 | RootFolder = Project.RootFolder;
21 | File = dir(fullfile(RootFolder,"Scripts","*.mlx"));
22 | File = {File.name};
23 | end
24 |
25 | end
26 |
27 | methods (TestClassSetup)
28 |
29 | function SetUpPath(testCase,Project)
30 | % Navigate to project root folder:
31 | testCase.RootFolder = Project.RootFolder;
32 | cd(testCase.RootFolder)
33 |
34 | % Check that solutions are on path:
35 | testCase.isSolnOnPath = isfolder("Solutions");
36 | if testCase.isSolnOnPath == 0
37 | addpath(fullfile(testCase.RootFolder,"InstructorResources","Solutions"))
38 | end
39 |
40 | % Close the StartUp app if still open:
41 | delete(findall(groot,'Name','StartUp App'))
42 |
43 | % Log MATLAB version:
44 | testCase.log("Running in " + version)
45 |
46 | end % function setUpPath
47 |
48 | end % methods (TestClassSetup)
49 |
50 | methods(Test)
51 |
52 | % Check that solutions files exist for each of the student
53 | % templates
54 | function ExistSolns(testCase,File)
55 | SolutionName = replace(string(File),".mlx","Soln.mlx");
56 | assert(exist(SolutionName,"file"),"Missing solutions for "+File);
57 | end
58 |
59 |
60 | function SmokeRun(testCase,File)
61 |
62 | % Navigate to project root folder:
63 | cd(testCase.RootFolder)
64 | FileToRun = replace(string(File),".mlx","Soln.mlx");
65 |
66 | % Pre-test:
67 | PreFiles = CheckPreFile(testCase,FileToRun);
68 | run(PreFiles);
69 |
70 | % Run SmokeTest
71 | disp(">> Running " + FileToRun);
72 | try
73 | run(fullfile("InstructorResources","Solutions",FileToRun));
74 | catch ME
75 |
76 | end
77 |
78 | % Post-test:
79 | PostFiles = CheckPostFile(testCase,FileToRun);
80 | run(PostFiles)
81 |
82 | % Log every figure created during run:
83 | Figures = findall(groot,'Type','figure');
84 | Figures = flipud(Figures);
85 | if ~isempty(Figures)
86 | for f = 1:size(Figures,1)
87 | if ~isempty(Figures(f).Number)
88 | FigDiag = matlab.unittest.diagnostics.FigureDiagnostic(Figures(f),'Formats','png');
89 | log(testCase,1,FigDiag);
90 | end
91 | end
92 | end
93 |
94 | % Close all figures and Simulink models
95 | close all force
96 | if any(matlab.addons.installedAddons().Name == "Simulink")
97 | bdclose all
98 | end
99 |
100 | % Rethrow error if any
101 | if exist("ME","var")
102 | if ~any(strcmp(ME.identifier,KnownIssuesID))
103 | rethrow(ME)
104 | end
105 | end
106 |
107 | end
108 |
109 | end
110 |
111 | methods (Access = private)
112 |
113 | function Path = CheckPreFile(testCase,Filename)
114 | PreFile = "Pre"+replace(Filename,".mlx",".m");
115 | PreFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PreFiles",PreFile);
116 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles"))
117 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles"))
118 | end
119 | if ~isfile(PreFilePath)
120 | writelines("% Pre-run script for "+Filename,PreFilePath)
121 | writelines("% ---- Known Issues -----",PreFilePath,'WriteMode','append');
122 | writelines("KnownIssuesID = "+char(34)+char(34)+";",PreFilePath,'WriteMode','append');
123 | writelines("% ---- Pre-run commands -----",PreFilePath,'WriteMode','append');
124 | writelines(" ",PreFilePath,'WriteMode','append');
125 | end
126 | Path = PreFilePath;
127 | end
128 |
129 | function Path = CheckPostFile(testCase,Filename)
130 | PostFile = "Post"+replace(Filename,".mlx",".m");
131 | PostFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PostFiles",PostFile);
132 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles"))
133 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles"))
134 | end
135 | if ~isfile(PostFilePath)
136 | writelines("% Post-run script for "+Filename,PostFilePath)
137 | writelines("% ---- Post-run commands -----",PostFilePath,'WriteMode','append');
138 | writelines(" ",PostFilePath,'WriteMode','append');
139 | end
140 | Path = PostFilePath;
141 | end
142 |
143 | end
144 |
145 | end
146 |
--------------------------------------------------------------------------------
/SoftwareTests/TestResults_R2024b.txt:
--------------------------------------------------------------------------------
1 | Name,Passed,Failed,Incomplete,Duration,Details
2 | SmokeTests[Project=Convolution]/SmokeRun(File=ConvolutionBasics.mlx),1,0,0,32.6587833,
3 | SmokeTests[Project=Convolution]/SmokeRun(File=ConvolutionFilters.mlx),1,0,0,15.8280241,
4 | SmokeTests[Project=Convolution]/SmokeRun(File=ConvolutionLTI.mlx),1,0,0,19.5143519,
5 | SmokeTests[Project=Convolution]/SmokeRun(File=PracticeProblemSolns.mlx),1,0,0,14.3835171,
6 |
--------------------------------------------------------------------------------
/Utilities/OldVersions/MainMenuOld.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Utilities/OldVersions/MainMenuOld.mlx
--------------------------------------------------------------------------------
/Utilities/OldVersions/READMEOld.mlx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Utilities/OldVersions/READMEOld.mlx
--------------------------------------------------------------------------------
/Utilities/ProjectSettings.mat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Utilities/ProjectSettings.mat
--------------------------------------------------------------------------------
/Utilities/ProjectShutdown.m:
--------------------------------------------------------------------------------
1 | % Close the StartUp app if still open:
2 | delete(findall(groot,'Name','StartUp App'))
--------------------------------------------------------------------------------
/Utilities/ProjectStartup.m:
--------------------------------------------------------------------------------
1 | function ProjectStartup
2 | % Set up check for version number
3 | proj = currentProject;
4 | if isMATLABReleaseOlderThan("R2023b")
5 | cd(proj.RootFolder)
6 | try
7 | if exist(fullfile("Utilities","OldVersions","MainMenuOld.mlx"),"file")
8 | movefile("MainMenu.mlx", fullfile("Utilities","OldVersions","MainMenuNew.mlx"))
9 | movefile(fullfile("Utilities","OldVersions","MainMenuOld.mlx"),fullfile(proj.RootFolder,"MainMenu.mlx"))
10 | end
11 | catch
12 | disp("Failed to move MainMenu.mlx.")
13 | end
14 | try
15 | if exist(fullfile("Utilities","OldVersions","READMEOld.mlx"),"file")
16 | movefile("README.mlx", fullfile("Utilities","OldVersions","READMENew.mlx"))
17 | movefile(fullfile("Utilities","OldVersions","READMEOld.mlx"),fullfile(proj.RootFolder,"README.mlx"))
18 | end
19 | catch
20 | disp("Failed to move README.mlx.")
21 | end
22 | end
23 | ProjectStartupApp
24 | end
--------------------------------------------------------------------------------
/Utilities/ProjectStartupApp.m:
--------------------------------------------------------------------------------
1 | classdef ProjectStartupApp < matlab.apps.AppBase
2 |
3 | % Properties that correspond to app components
4 | properties (Access = public)
5 | StartUpAppUIFigure matlab.ui.Figure
6 | TabGroup matlab.ui.container.TabGroup
7 | WelcomeTab matlab.ui.container.Tab
8 | Image matlab.ui.control.Image
9 | READMEButton matlab.ui.control.Button
10 | ReviewUsButton matlab.ui.control.Button
11 | MainMenuButton matlab.ui.control.Button
12 | WelcomeTitle matlab.ui.control.Label
13 | TabReview matlab.ui.container.Tab
14 | OtherButton matlab.ui.control.Button
15 | StudentButton matlab.ui.control.Button
16 | FacultyButton matlab.ui.control.Button
17 | Q1 matlab.ui.control.Label
18 | ReviewTitle matlab.ui.control.Label
19 | ReviewText matlab.ui.control.Label
20 | end
21 |
22 |
23 | properties (Access = private)
24 | GitHubOrganization = "MathWorks-Teaching-Resources"; % Description
25 | GitHubRepository = "Convolution-Digital-Signal-Processing";
26 | end
27 | %% How to customize the app?
28 | %{
29 |
30 | This StartUp app is designed to be customized to your module. It
31 | requires a minimum number of customization:
32 |
33 | 1. Change "Module Template" in app.WelcomeTitle by your module name
34 | 2. Change "Module Template" in app.ReviewTitle by your module name
35 | 3. Change the GitHubRepository (line 25) to the correct value
36 | 4. Change image in app.Image by the cover image you would like for your
37 | module. This image should be located in rootFolder/Images
38 | 5. Create your MS Form:
39 | a. Make a copy of the Faculty and the Student Template surveys
40 | b. Customize the name of the survey to match the name of your
41 | survey
42 | c. Click on "Collect responses", select "Anyone can respond" and
43 | copy the form link to SetupAppLinks (see step 6).
44 | 5. Create your MS Sway:
45 | a. Go to MS Sway
46 | b. Create a blank sway
47 | c. Add the name of your module to the title box
48 | d. Click "Share", Select "Anyone with a link", Select "View"
49 | e. Copy the sway link to SetupAppLinks (see step 6).
50 | 6. Add the Survey and Sway link to Utilities/SurveyLinks using
51 | SetupAppLinks.mlx in InternalFiles/RequiredFunctions/StartUpFcn
52 | 7. Save > Export to .m file and save the result as
53 | Utilities/ProjectStartupApp.m
54 |
55 | %}
56 |
57 | methods (Access = private, Static)
58 |
59 | function pingSway(app)
60 | try
61 | if ~ispref("MCCTEAM")
62 | load Utilities\SurveyLinks.mat SwayLink
63 | webread(SwayLink);
64 | end
65 | catch
66 | end
67 | end
68 |
69 | function openStudentForm(app)
70 | try
71 | load Utilities\SurveyLinks.mat StudentFormLink
72 | web(StudentFormLink);
73 | catch
74 | end
75 | end
76 |
77 | function openFacultyForm(app)
78 | try
79 | load Utilities\SurveyLinks.mat FacultyFormLink
80 | web(FacultyFormLink);
81 | catch
82 | end
83 | end
84 |
85 | function saveSettings(isReviewed,numLoad)
86 | try
87 | save(fullfile("Utilities","ProjectSettings.mat"),"isReviewed","numLoad");
88 | catch
89 | end
90 | end
91 |
92 | end
93 |
94 |
95 | % Callbacks that handle component events
96 | methods (Access = private)
97 |
98 | % Code that executes after component creation
99 | function startupFcn(app)
100 |
101 | % Switch tab to review if has not been reviewed yet
102 | if isfile(fullfile("Utilities","ProjectSettings.mat"))
103 | load(fullfile("Utilities","ProjectSettings.mat"),"isReviewed","numLoad");
104 | numLoad = numLoad + 1; % Increment counter
105 | else
106 | isReviewed = false;
107 | numLoad = 1; % Initialize counter
108 | end
109 |
110 | % Switch tab for review
111 | if ~isReviewed && numLoad > 2
112 | isReviewed = true;
113 | app.TabGroup.SelectedTab = app.TabReview;
114 | end
115 |
116 | % Save new settings
117 | app.saveSettings(isReviewed,numLoad)
118 |
119 | % Download links to survey (should only work when module goes
120 | % public on GitHub)
121 | try
122 | import matlab.net.*
123 | import matlab.net.http.*
124 |
125 | Request = RequestMessage;
126 | Request.Method = 'GET';
127 | Address = URI("http://api.github.com/repos/"+app.GitHubOrganization+...
128 | "/"+app.GitHubRepository+"/contents/Utilities/SurveyLinks.mat");
129 | Request.Header = HeaderField("X-GitHub-Api-Version","2022-11-28");
130 | Request.Header(2) = HeaderField("Accept","application/vnd.github+json");
131 | [Answer,~,~] = send(Request,Address);
132 | websave(fullfile("Utilities/SurveyLinks.mat"),Answer.Body.Data.download_url);
133 | catch
134 | end
135 |
136 | end
137 |
138 | % Close request function: StartUpAppUIFigure
139 | function StartUpAppUIFigureCloseRequest(app, event)
140 | if event.Source == app.READMEButton
141 | open README.mlx
142 | elseif event.Source == app.MainMenuButton
143 | open MainMenu.mlx
144 | elseif event.Source == app.FacultyButton
145 | open MainMenu.mlx
146 | elseif event.Source == app.StudentButton
147 | open MainMenu.mlx
148 | elseif event.Source == app.OtherButton
149 | open MainMenu.mlx
150 | else
151 | disp("Thank you for your time.")
152 | end
153 | delete(app)
154 | end
155 |
156 | % Button pushed function: MainMenuButton
157 | function MainMenuButtonPushed(app, event)
158 | StartUpAppUIFigureCloseRequest(app,event)
159 | end
160 |
161 | % Button pushed function: FacultyButton
162 | function FacultyButtonPushed(app, event)
163 | app.pingSway;
164 | app.openFacultyForm;
165 | StartUpAppUIFigureCloseRequest(app,event)
166 | end
167 |
168 | % Button pushed function: StudentButton
169 | function StudentButtonPushed(app, event)
170 | app.pingSway;
171 | app.openStudentForm;
172 | StartUpAppUIFigureCloseRequest(app,event)
173 | end
174 |
175 | % Button pushed function: OtherButton
176 | function OtherButtonPushed(app, event)
177 | app.pingSway;
178 | app.openStudentForm;
179 | StartUpAppUIFigureCloseRequest(app,event)
180 | end
181 |
182 | % Button pushed function: ReviewUsButton
183 | function ReviewUsButtonPushed(app, event)
184 | app.TabGroup.SelectedTab = app.TabReview;
185 | end
186 |
187 | % Button pushed function: READMEButton
188 | function READMEButtonPushed(app, event)
189 | StartUpAppUIFigureCloseRequest(app,event)
190 | end
191 | end
192 |
193 | % Component initialization
194 | methods (Access = private)
195 |
196 | % Create UIFigure and components
197 | function createComponents(app)
198 |
199 | % Create StartUpAppUIFigure and hide until all components are created
200 | app.StartUpAppUIFigure = uifigure('Visible', 'off');
201 | app.StartUpAppUIFigure.AutoResizeChildren = 'off';
202 | app.StartUpAppUIFigure.Position = [100 100 276 430];
203 | app.StartUpAppUIFigure.Name = 'StartUp App';
204 | app.StartUpAppUIFigure.Resize = 'off';
205 | app.StartUpAppUIFigure.CloseRequestFcn = createCallbackFcn(app, @StartUpAppUIFigureCloseRequest, true);
206 |
207 | % Create TabGroup
208 | app.TabGroup = uitabgroup(app.StartUpAppUIFigure);
209 | app.TabGroup.AutoResizeChildren = 'off';
210 | app.TabGroup.Position = [1 1 276 460];
211 |
212 | % Create WelcomeTab
213 | app.WelcomeTab = uitab(app.TabGroup);
214 | app.WelcomeTab.AutoResizeChildren = 'off';
215 | app.WelcomeTab.Title = 'Tab';
216 |
217 | % Create WelcomeTitle
218 | app.WelcomeTitle = uilabel(app.WelcomeTab);
219 | app.WelcomeTitle.HorizontalAlignment = 'center';
220 | app.WelcomeTitle.VerticalAlignment = 'top';
221 | app.WelcomeTitle.WordWrap = 'on';
222 | app.WelcomeTitle.FontSize = 24;
223 | app.WelcomeTitle.FontWeight = 'bold';
224 | app.WelcomeTitle.Position = [2 330 274 89];
225 | app.WelcomeTitle.Text = 'Welcome to Convolution in Digital Signal Processing';
226 |
227 | % Create MainMenuButton
228 | app.MainMenuButton = uibutton(app.WelcomeTab, 'push');
229 | app.MainMenuButton.ButtonPushedFcn = createCallbackFcn(app, @MainMenuButtonPushed, true);
230 | app.MainMenuButton.FontSize = 18;
231 | app.MainMenuButton.Position = [59 96 161 35];
232 | app.MainMenuButton.Text = 'Main Menu';
233 |
234 | % Create ReviewUsButton
235 | app.ReviewUsButton = uibutton(app.WelcomeTab, 'push');
236 | app.ReviewUsButton.ButtonPushedFcn = createCallbackFcn(app, @ReviewUsButtonPushed, true);
237 | app.ReviewUsButton.FontSize = 18;
238 | app.ReviewUsButton.Position = [59 10 161 35];
239 | app.ReviewUsButton.Text = 'Review Us';
240 |
241 | % Create READMEButton
242 | app.READMEButton = uibutton(app.WelcomeTab, 'push');
243 | app.READMEButton.ButtonPushedFcn = createCallbackFcn(app, @READMEButtonPushed, true);
244 | app.READMEButton.FontSize = 18;
245 | app.READMEButton.Position = [59 53 161 35];
246 | app.READMEButton.Text = 'README';
247 |
248 | % Create Image
249 | app.Image = uiimage(app.WelcomeTab);
250 | app.Image.Position = [16 141 245 186];
251 | app.Image.ImageSource = 'Conv2D.gif';
252 |
253 | % Create TabReview
254 | app.TabReview = uitab(app.TabGroup);
255 | app.TabReview.AutoResizeChildren = 'off';
256 | app.TabReview.Title = 'Tab2';
257 | app.TabReview.HandleVisibility = 'off';
258 |
259 | % Create ReviewText
260 | app.ReviewText = uilabel(app.TabReview);
261 | app.ReviewText.HorizontalAlignment = 'center';
262 | app.ReviewText.VerticalAlignment = 'top';
263 | app.ReviewText.WordWrap = 'on';
264 | app.ReviewText.FontSize = 18;
265 | app.ReviewText.Position = [16 243 245 69];
266 | app.ReviewText.Text = 'Please help us improve your experience by answering a few questions.';
267 |
268 | % Create ReviewTitle
269 | app.ReviewTitle = uilabel(app.TabReview);
270 | app.ReviewTitle.HorizontalAlignment = 'center';
271 | app.ReviewTitle.VerticalAlignment = 'top';
272 | app.ReviewTitle.WordWrap = 'on';
273 | app.ReviewTitle.FontSize = 24;
274 | app.ReviewTitle.FontWeight = 'bold';
275 | app.ReviewTitle.Position = [2 326 274 93];
276 | app.ReviewTitle.Text = 'Welcome to Convolution in Digital Signal Processing';
277 |
278 | % Create Q1
279 | app.Q1 = uilabel(app.TabReview);
280 | app.Q1.HorizontalAlignment = 'center';
281 | app.Q1.VerticalAlignment = 'top';
282 | app.Q1.WordWrap = 'on';
283 | app.Q1.FontSize = 18;
284 | app.Q1.FontWeight = 'bold';
285 | app.Q1.Position = [16 141 245 69];
286 | app.Q1.Text = 'What describes you best?';
287 |
288 | % Create FacultyButton
289 | app.FacultyButton = uibutton(app.TabReview, 'push');
290 | app.FacultyButton.ButtonPushedFcn = createCallbackFcn(app, @FacultyButtonPushed, true);
291 | app.FacultyButton.FontSize = 18;
292 | app.FacultyButton.Position = [64 127 150 40];
293 | app.FacultyButton.Text = 'Faculty';
294 |
295 | % Create StudentButton
296 | app.StudentButton = uibutton(app.TabReview, 'push');
297 | app.StudentButton.ButtonPushedFcn = createCallbackFcn(app, @StudentButtonPushed, true);
298 | app.StudentButton.FontSize = 18;
299 | app.StudentButton.Position = [64 80 150 40];
300 | app.StudentButton.Text = 'Student';
301 |
302 | % Create OtherButton
303 | app.OtherButton = uibutton(app.TabReview, 'push');
304 | app.OtherButton.ButtonPushedFcn = createCallbackFcn(app, @OtherButtonPushed, true);
305 | app.OtherButton.FontSize = 18;
306 | app.OtherButton.Position = [64 34 150 40];
307 | app.OtherButton.Text = 'Other';
308 |
309 | % Show the figure after all components are created
310 | app.StartUpAppUIFigure.Visible = 'on';
311 | end
312 | end
313 |
314 | % App creation and deletion
315 | methods (Access = public)
316 |
317 | % Construct app
318 | function app = ProjectStartupApp
319 |
320 | % Create UIFigure and components
321 | createComponents(app)
322 |
323 | % Register the app with App Designer
324 | registerApp(app, app.StartUpAppUIFigure)
325 |
326 | % Execute the startup function
327 | runStartupFcn(app, @startupFcn)
328 |
329 | if nargout == 0
330 | clear app
331 | end
332 | end
333 |
334 | % Code that executes before app deletion
335 | function delete(app)
336 |
337 | % Delete UIFigure when app is deleted
338 | delete(app.StartUpAppUIFigure)
339 | end
340 | end
341 | end
--------------------------------------------------------------------------------
/Utilities/SurveyLinks.mat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Convolution-Digital-Signal-Processing/de68271e7c4058194fe60443990527c3e713766f/Utilities/SurveyLinks.mat
--------------------------------------------------------------------------------
/license.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2021, The MathWorks, Inc.
2 | All rights reserved.
3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
5 | 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.
6 | 3. In all cases, the software is, and all modifications and derivatives of the software shall be, licensed to you solely for use in conjunction with MathWorks products and service offerings.
7 | 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 HOLDER 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.
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/resources/project/6xhH2l9GP9loT6TdFn_Mo65sDHg/P8PSrqcBHMbGhqD2r1d9oc0h3TUd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/6xhH2l9GP9loT6TdFn_Mo65sDHg/P8PSrqcBHMbGhqD2r1d9oc0h3TUp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/8h3kimKoV3g5SPdcFPq6bNqde20/yvc00et_D9w1RZcV5T2-bniDUu0d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/8h3kimKoV3g5SPdcFPq6bNqde20/yvc00et_D9w1RZcV5T2-bniDUu0p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/BT5hWoz-UTefONdqForZyI91O8Y/Ur1esh7xN9L6aqDUKBE31DKE1Qod.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/BT5hWoz-UTefONdqForZyI91O8Y/Ur1esh7xN9L6aqDUKBE31DKE1Qop.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/-DlbouAcj0Owvo00QtTpWujx9YMd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/-DlbouAcj0Owvo00QtTpWujx9YMp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/DxJWFQ6s-5tgLo-3uCpCdq16n-sd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/DxJWFQ6s-5tgLo-3uCpCdq16n-sp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/PAote5_-RAZ9uo-gA_FuZhRSquQd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/PAote5_-RAZ9uo-gA_FuZhRSquQp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/cn2Ee7NifKI7ffnw_Fjz5lrC1Qgd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/cn2Ee7NifKI7ffnw_Fjz5lrC1Qgp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/d-PM_SU5Hw6XmBK8zA1PIfrPki0d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/d-PM_SU5Hw6XmBK8zA1PIfrPki0p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/e7wCov_BYJUY6VsFZYx5ab3064gd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/e7wCov_BYJUY6VsFZYx5ab3064gp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/x9kRh-n1S7s6yE1EzN4stHJjWq0d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/x9kRh-n1S7s6yE1EzN4stHJjWq0p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/HoHDHQ_WvHAAKj5aJOrvrg_vpt8/xXlmKuOQ7YT_G1elNhbKQIUqSRMd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/HoHDHQ_WvHAAKj5aJOrvrg_vpt8/xXlmKuOQ7YT_G1elNhbKQIUqSRMp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/sZWUss_PB_DhtUei_LX7trqUyaYd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/sZWUss_PB_DhtUei_LX7trqUyaYp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/xcK8fO1pjra5DR0jot5vrzlBV84d.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/xcK8fO1pjra5DR0jot5vrzlBV84p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/2kj09UetkV_lru3gvSPXnY6-nM4d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/2kj09UetkV_lru3gvSPXnY6-nM4p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/KKyDJtbdIBOlaeHmIZd5VX6vqx8d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/KKyDJtbdIBOlaeHmIZd5VX6vqx8p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/QWNDYJD5mGW1bWYvPx9DtKnxzw4d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/QWNDYJD5mGW1bWYvPx9DtKnxzw4p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/R1RggVhA72agIvELiuhWPRS8F0Id.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/R1RggVhA72agIvELiuhWPRS8F0Ip.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/aEHSZBIY-yve10yGis12Zr5DLZod.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/aEHSZBIY-yve10yGis12Zr5DLZop.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/j4xwF_j8iFTVayUMfxLgMnTbencd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/j4xwF_j8iFTVayUMfxLgMnTbencp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/r8LR4nLmg9ai3oHrW1r_-KocQzkd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/r8LR4nLmg9ai3oHrW1r_-KocQzkp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/p5HYYVUpTuYgZwnT8QkkzaoJraUd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/p5HYYVUpTuYgZwnT8QkkzaoJraUp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/q4FWbcu8zEbneDjWzNwfvfvjQNAd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/q4FWbcu8zEbneDjWzNwfvfvjQNAp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/s-04wUzHjOhlMa1CW_zpJwm8iDMd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/s-04wUzHjOhlMa1CW_zpJwm8iDMp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/-mSO0J7ItHIgO7c8PKPkcBPBAbMd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/-mSO0J7ItHIgO7c8PKPkcBPBAbMp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/5InFewK6fGZq3ty6eSEAj3MiKi8d.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/5InFewK6fGZq3ty6eSEAj3MiKi8p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/99pudfj12BA9A1k87a_Dv4DFvPgd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/99pudfj12BA9A1k87a_Dv4DFvPgp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/QOpe-1pctdftDIjwQLRdjOUZW44d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/QOpe-1pctdftDIjwQLRdjOUZW44p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/SbYIEUdleY6e74tBazJyZWOUkSsd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/SbYIEUdleY6e74tBazJyZWOUkSsp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/fLKObL0j7NxgbhncYTq0NqApBMYd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/fLKObL0j7NxgbhncYTq0NqApBMYp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/fjRQtWiSIy7hIlj-Kmk87M7s21k/NjSPEMsIuLUyIpr2u1Js5bVPsOsd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/fjRQtWiSIy7hIlj-Kmk87M7s21k/NjSPEMsIuLUyIpr2u1Js5bVPsOsp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/RMvf4mEDuznAOqU6SKNmIWErfxgd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/RMvf4mEDuznAOqU6SKNmIWErfxgp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/ZTr3GAe6p03ZVs2FdKKE0JsiFMQd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/ZTr3GAe6p03ZVs2FdKKE0JsiFMQp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/nGmc4yUWSwVpS8w8tP7IolwQs0Ed.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/nGmc4yUWSwVpS8w8tP7IolwQs0Ep.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/uIbyU9dPEHKvxjdwx5pD9PDDCZYd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/uIbyU9dPEHKvxjdwx5pD9PDDCZYp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/2uRqUwgzsMPtKV1vY4JvGEQwdJId.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/2uRqUwgzsMPtKV1vY4JvGEQwdJIp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/8h3kimKoV3g5SPdcFPq6bNqde20d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/8h3kimKoV3g5SPdcFPq6bNqde20p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/BT5hWoz-UTefONdqForZyI91O8Yd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/BT5hWoz-UTefONdqForZyI91O8Yp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/KocSmEw1PpelhlG7ZNeMUdHVtywd.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/KocSmEw1PpelhlG7ZNeMUdHVtywp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/QMJD9OLFzxcTTbPOoh-ahQ4zTRUd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/QMJD9OLFzxcTTbPOoh-ahQ4zTRUp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZN2RlSIbyWXhOxbxxI4hOawbMD4d.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZN2RlSIbyWXhOxbxxI4hOawbMD4p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZdVxxv9BsNz7MGUxtEc6Pq3qh1Md.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZdVxxv9BsNz7MGUxtEc6Pq3qh1Mp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/iMwdHOXOBiBXhnA_li8gtEJVTjcd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/iMwdHOXOBiBXhnA_li8gtEJVTjcp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rh0jHbNfmojECiiHH7BQHmZTsWkd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rh0jHbNfmojECiiHH7BQHmZTsWkp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rnpMu7jn2QWt_rQcz8FJ-MxGzVId.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rnpMu7jn2QWt_rQcz8FJ-MxGzVIp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/6x1BhZX_fLnKpcwqra0qFwv1jIgp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/6xhH2l9GP9loT6TdFn_Mo65sDHgp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/EEtUlUb-dLAdf0KpMVivaUlztwAp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/GiiBklLgTxteCEmomM8RCvWT0nQd.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/GiiBklLgTxteCEmomM8RCvWT0nQp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/HoHDHQ_WvHAAKj5aJOrvrg_vpt8p.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/KAXfQgCar2Yb8zOxgvf9hdmLP1Ep.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/NmGqIpAwUJcXFyLjFAGnU9uyN5Yp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/WZRuNzqc-Db7NcQAZO8Y-R8U9ccp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/fjRQtWiSIy7hIlj-Kmk87M7s21kp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/root/qaw0eS1zuuY1ar9TdPn1GMfrjbQp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/rootp.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/uuid-366ca619-578a-4bc0-8012-bfa62d28c37f.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/resources/project/uuid-47fbbcc6-62c4-483f-9ecf-91b5909f408e.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------