├── .gitignore ├── LICENSE ├── README.md ├── SETUP.md ├── book.json ├── docs ├── .gitbook │ └── assets │ │ ├── 0_opening.PNG │ │ ├── 10_close_installer (1).PNG │ │ ├── 10_close_installer.PNG │ │ ├── 10_enter_pwd_rules (1).png │ │ ├── 10_enter_pwd_rules.png │ │ ├── 10_nvic_dmas_enabled_1.png │ │ ├── 11_close_installer (1).png │ │ ├── 11_close_installer.png │ │ ├── 11_workspace (1).PNG │ │ ├── 11_workspace.PNG │ │ ├── 12_project_settings_1.png │ │ ├── 12_select_workspace_1 (1).png │ │ ├── 12_select_workspace_1.png │ │ ├── 12_sw4stm32 (1).PNG │ │ ├── 12_sw4stm32.PNG │ │ ├── 13_generate_success_1.png │ │ ├── 13_sw4stm32 (1).png │ │ ├── 13_sw4stm32.png │ │ ├── 14_import.PNG │ │ ├── 15_existing_project.PNG │ │ ├── 17_select_project.PNG │ │ ├── 18_workspace (1).PNG │ │ ├── 18_workspace (2).PNG │ │ ├── 18_workspace.PNG │ │ ├── 19_successful_build (1).PNG │ │ ├── 19_successful_build (2).PNG │ │ ├── 19_successful_build.PNG │ │ ├── 1_get_software-1 (1).PNG │ │ ├── 1_get_software-1-1.PNG │ │ ├── 1_get_software-1.PNG │ │ ├── 1_initial_linux (1).png │ │ ├── 1_initial_linux.png │ │ ├── 1_initial_win (1).PNG │ │ ├── 1_initial_win.PNG │ │ ├── 1_new_proj.PNG │ │ ├── 20_debug.png │ │ ├── 22_enter_debug_perspective (1).PNG │ │ ├── 22_enter_debug_perspective (2).PNG │ │ ├── 22_enter_debug_perspective.PNG │ │ ├── 24_led_blinking (1).png │ │ ├── 24_led_blinking (2).png │ │ ├── 24_led_blinking.png │ │ ├── 24_resume (1).png │ │ ├── 24_resume (2).png │ │ ├── 24_resume (3).png │ │ ├── 24_resume-1 (1).png │ │ ├── 24_resume-1.png │ │ ├── 24_resume.png │ │ ├── 25_disconnect_1 (1).png │ │ ├── 25_disconnect_1 (2).png │ │ ├── 25_disconnect_1.png │ │ ├── 26_switch_perspective_1 (1).png │ │ ├── 26_switch_perspective_1 (2).png │ │ ├── 26_switch_perspective_1.png │ │ ├── 2_filter_board.PNG │ │ ├── 2_installation_path (1).PNG │ │ ├── 2_installation_path.PNG │ │ ├── 3_board_loaded_1.PNG │ │ ├── 4_create_shortcuts (1).PNG │ │ ├── 4_create_shortcuts.PNG │ │ ├── 4_enable_i2s.PNG │ │ ├── 5_config_tab.PNG │ │ ├── 5_confirm (1).PNG │ │ ├── 5_confirm.PNG │ │ ├── 5_specify_path (1).png │ │ ├── 5_specify_path.png │ │ ├── 7_driver_setup (1).PNG │ │ ├── 7_driver_setup.PNG │ │ ├── 7_i2s1_dma_settings.PNG │ │ ├── 7_select_packs (1).png │ │ ├── 7_select_packs.png │ │ ├── 8_confirm_packs (1).png │ │ ├── 8_confirm_packs.png │ │ ├── 8_driver_setup_complete (1).PNG │ │ ├── 8_driver_setup_complete.PNG │ │ ├── 9_finish_installation (1).PNG │ │ ├── 9_finish_installation.PNG │ │ ├── 9_i2s2_dma_settings.PNG │ │ ├── 9_installation_done (1).png │ │ ├── 9_installation_done.png │ │ ├── activate_the_clock_for_tim2.png │ │ ├── adafruit_products_3678_top_orig.jpg │ │ ├── biquad_direct_1_wiki-1 (1).png │ │ ├── biquad_direct_1_wiki-1.png │ │ ├── biquad_direct_1_wiki.png │ │ ├── biquad_direct_2_wiki-1 (1).png │ │ ├── biquad_direct_2_wiki-1.png │ │ ├── biquad_direct_2_wiki.png │ │ ├── block_diagram.png │ │ ├── clarinet_spectrum-1 (1).png │ │ ├── clarinet_spectrum-1.png │ │ ├── clarinet_spectrum.png │ │ ├── config_tab-1.png │ │ ├── cubemx.png │ │ ├── debug_config_menu (1).png │ │ ├── debug_config_menu-1.png │ │ ├── debug_config_menu.png │ │ ├── debug_config_old_name (1).png │ │ ├── debug_config_old_name (2).png │ │ ├── debug_config_old_name.png │ │ ├── direct_form_1_complete (1).png │ │ ├── direct_form_1_complete-1.png │ │ ├── direct_form_1_complete.png │ │ ├── direct_form_1_incomplete-1 (1).png │ │ ├── direct_form_1_incomplete-1 (2).png │ │ ├── direct_form_1_incomplete-1.png │ │ ├── direct_form_2_complete (1).png │ │ ├── direct_form_2_complete-1.png │ │ ├── direct_form_2_complete.png │ │ ├── direct_form_2_incomplete-1 (1).png │ │ ├── direct_form_2_incomplete-1.png │ │ ├── direct_form_2_incomplete.png │ │ ├── discontinuous_sine (1).png │ │ ├── discontinuous_sine (2).png │ │ ├── discontinuous_sine.png │ │ ├── doubling_continuous (1).png │ │ ├── doubling_continuous (2).png │ │ ├── doubling_continuous.png │ │ ├── doubling_discontinuity (1).png │ │ ├── doubling_discontinuity (2).png │ │ ├── doubling_discontinuity.png │ │ ├── energy_gs_lpc (1).png │ │ ├── energy_gs_lpc-1.png │ │ ├── energy_gs_lpc.png │ │ ├── energy_problem-1 (1).png │ │ ├── energy_problem-1.png │ │ ├── energy_problem.png │ │ ├── equation_system (1).png │ │ ├── equation_system-1.png │ │ ├── equation_system.png │ │ ├── errorstoppreviousconfig_enlarged (1).png │ │ ├── errorstoppreviousconfig_enlarged-1.png │ │ ├── errorstoppreviousconfig_enlarged.png │ │ ├── filter_classification-1 (1).png │ │ ├── filter_classification-1.png │ │ ├── filter_classification.png │ │ ├── final_wiring.jpg │ │ ├── fir_321-1 (1).png │ │ ├── fir_321-1.png │ │ ├── fir_321.png │ │ ├── fir_41-1 (1).png │ │ ├── fir_41-1 (2).png │ │ ├── fir_41-1.png │ │ ├── fir_comparison (1).png │ │ ├── fir_comparison (2).png │ │ ├── fir_comparison.png │ │ ├── fir_filter-1 (1).png │ │ ├── fir_filter-1 (2).png │ │ ├── fir_filter-1.png │ │ ├── firmware_1 (1).png │ │ ├── firmware_1 (2).png │ │ ├── firmware_1.png │ │ ├── firmware_2 (1).png │ │ ├── firmware_2 (2).png │ │ ├── firmware_2.png │ │ ├── firmware_3 (1).png │ │ ├── firmware_3 (2).png │ │ ├── firmware_3.png │ │ ├── firmware_4 (1).png │ │ ├── firmware_4 (2).png │ │ ├── firmware_4.png │ │ ├── firmware_5.png │ │ ├── freq_resp_high_pass (1).png │ │ ├── freq_resp_high_pass (2).png │ │ ├── freq_resp_high_pass.png │ │ ├── freq_resp_high_pass_log (1).png │ │ ├── freq_resp_high_pass_log (2).png │ │ ├── freq_resp_high_pass_log-1 (1).png │ │ ├── freq_resp_high_pass_log-1 (2).png │ │ ├── freq_resp_high_pass_log-1.png │ │ ├── freq_resp_high_pass_log.png │ │ ├── hpf_comparison-1 (1).png │ │ ├── hpf_comparison-1 (2).png │ │ ├── hpf_comparison-1.png │ │ ├── i2s_timing.png │ │ ├── iir_comparison-1 (1).png │ │ ├── iir_comparison-1 (2).png │ │ ├── iir_comparison-1.png │ │ ├── iir_varying_pole-1 (1).png │ │ ├── iir_varying_pole-1.png │ │ ├── iir_varying_pole.png │ │ ├── intro (1).jpg │ │ ├── intro.jpg │ │ ├── linux_installation_1.png │ │ ├── linux_installation_3.png │ │ ├── linux_installation_4.png │ │ ├── linux_installation_5.png │ │ ├── linux_running_software.png │ │ ├── lpc (1).jpg │ │ ├── lpc-1.jpg │ │ ├── lpc.jpg │ │ ├── mac_install_1 (1).png │ │ ├── mac_install_1-1-1.png │ │ ├── mac_install_1.png │ │ ├── mac_install_10.png │ │ ├── mac_install_11 (1).png │ │ ├── mac_install_11.png │ │ ├── mac_install_12.png │ │ ├── mac_install_1_1.png │ │ ├── mac_install_1_2.png │ │ ├── mac_install_2.png │ │ ├── mac_install_4 (1).png │ │ ├── mac_install_4.png │ │ ├── mac_install_5.png │ │ ├── mac_install_6-1-1 (1).png │ │ ├── mac_install_6-1-1.png │ │ ├── mac_install_6.png │ │ ├── mac_install_7-1-1 (1).png │ │ ├── mac_install_7-1-1.png │ │ ├── mac_install_7.png │ │ ├── mac_install_9.png │ │ ├── mac_run.png │ │ ├── moving_average-1 (1).png │ │ ├── moving_average-1 (2).png │ │ ├── moving_average-1.png │ │ ├── nucleo_board.jpg │ │ ├── offset_hpf (1).png │ │ ├── offset_hpf (2).png │ │ ├── offset_hpf.png │ │ ├── original_hpf-1 (1).png │ │ ├── original_hpf-1.png │ │ ├── original_hpf.png │ │ ├── original_offset (1).png │ │ ├── original_offset (2).png │ │ ├── original_offset.png │ │ ├── pinning.png │ │ ├── pinout_tab (1).png │ │ ├── pinout_tab (2).png │ │ ├── pinout_tab.png │ │ ├── proj_prop-1.png │ │ ├── screenshot-2019-09-25-at-12.14.38-2 (1).png │ │ ├── screenshot-2019-09-25-at-12.14.38-2-1.png │ │ ├── screenshot-2019-09-25-at-12.14.38-2.png │ │ ├── screenshot-2019-09-25-at-12.18.18 (1).png │ │ ├── screenshot-2019-09-25-at-12.18.18 (2).png │ │ ├── screenshot-2019-09-25-at-12.18.18.png │ │ ├── screenshot-2019-09-25-at-15.54.25-2-1 (1).png │ │ ├── screenshot-2019-09-25-at-15.54.25-2-1.png │ │ ├── screenshot-2019-09-25-at-17.06.48 (1).png │ │ ├── screenshot-2019-09-25-at-17.06.48-1.png │ │ ├── screenshot-2019-09-25-at-17.06.48.png │ │ ├── screenshot-2019-09-25-at-17.07.27.png │ │ ├── screenshot-2019-09-25-at-17.42.06 (1).png │ │ ├── screenshot-2019-09-25-at-17.42.06.png │ │ ├── screenshot-2019-09-25-at-17.51.04 (1).png │ │ ├── screenshot-2019-09-25-at-17.51.04.png │ │ ├── screenshot-2019-09-25-at-17.51.19 (1).png │ │ ├── screenshot-2019-09-25-at-17.51.19.png │ │ ├── screenshot-2019-09-25-at-17.51.49 (1).png │ │ ├── screenshot-2019-09-25-at-17.51.49-1 (1).png │ │ ├── screenshot-2019-09-25-at-17.51.49-1 (2).png │ │ ├── screenshot-2019-09-25-at-17.51.49-1.png │ │ ├── screenshot-2019-09-25-at-17.51.49.png │ │ ├── screenshot-2019-09-25-at-17.53.06 (1).png │ │ ├── screenshot-2019-09-25-at-17.53.06-1 (1).png │ │ ├── screenshot-2019-09-25-at-17.53.06-1.png │ │ ├── screenshot-2019-09-25-at-17.53.06.png │ │ ├── screenshot-2019-09-25-at-17.54.24 (1).png │ │ ├── screenshot-2019-09-25-at-17.54.24.png │ │ ├── screenshot-2019-09-25-at-17.54.49-1 (1).png │ │ ├── screenshot-2019-09-25-at-17.54.49-1.png │ │ ├── screenshot-2019-10-01-at-11.34.37 (1).png │ │ ├── screenshot-2019-10-01-at-11.34.37.png │ │ ├── screenshot-2019-10-01-at-11.36.27 (1).png │ │ ├── screenshot-2019-10-01-at-11.36.27.png │ │ ├── screenshot-2019-10-01-at-11.37.05 (1).png │ │ ├── screenshot-2019-10-01-at-11.37.05.png │ │ ├── screenshot-2019-10-07-at-13.36.57 (1).png │ │ ├── screenshot-2019-10-07-at-13.36.57.png │ │ ├── screenshot-2019-10-07-at-13.39.21 (1).png │ │ ├── screenshot-2019-10-07-at-13.39.21.png │ │ ├── screenshot-2019-10-07-at-13.58.37 (1).png │ │ ├── screenshot-2019-10-07-at-13.58.37.png │ │ ├── screenshot-2019-10-07-at-14.05.00 (1).png │ │ ├── screenshot-2019-10-07-at-14.05.00.png │ │ ├── screenshot-2019-10-07-at-14.52.49 (1).png │ │ ├── screenshot-2019-10-07-at-14.52.49.png │ │ ├── screenshot-2019-10-07-at-15.06.44 (1).png │ │ ├── screenshot-2019-10-07-at-15.06.44.png │ │ ├── screenshot-2019-10-07-at-15.11.56 (1).png │ │ ├── screenshot-2019-10-07-at-15.11.56.png │ │ ├── screenshot-2019-10-07-at-15.15.01 (1).png │ │ ├── screenshot-2019-10-07-at-15.15.01.png │ │ ├── screenshot-2019-10-07-at-15.36.36 (1).png │ │ ├── screenshot-2019-10-07-at-15.36.36.png │ │ ├── screenshot-2019-10-07-at-15.42.23 (1).png │ │ ├── screenshot-2019-10-07-at-15.42.23.png │ │ ├── screenshot-2019-10-07-at-15.43.06 (1).png │ │ ├── screenshot-2019-10-07-at-15.43.06.png │ │ ├── screenshot-2019-10-07-at-15.46.31 (1).png │ │ ├── screenshot-2019-10-07-at-15.46.31.png │ │ ├── screenshot-2019-10-10-at-16.27.39 (1).png │ │ ├── screenshot-2019-10-10-at-16.27.39.png │ │ ├── screenshot-2019-10-10-at-16.29.32 (1).png │ │ ├── screenshot-2019-10-10-at-16.29.32.png │ │ ├── screenshot-2019-10-10-at-16.29.58 (1).png │ │ ├── screenshot-2019-10-10-at-16.29.58.png │ │ ├── screenshot-2019-10-10-at-16.32.28 (1).png │ │ ├── screenshot-2019-10-10-at-16.32.28.png │ │ ├── screenshot-2019-10-10-at-16.57.46 (1).png │ │ ├── screenshot-2019-10-10-at-16.57.46.png │ │ ├── screenshot-2019-10-10-at-16.58.09 (1).png │ │ ├── screenshot-2019-10-10-at-16.58.09.png │ │ ├── sensors_3421_quarter_orig.jpg │ │ ├── setup_tim2_as_us_timebase_edited-1-1.png │ │ ├── shift_spectrum (1).png │ │ ├── shift_spectrum-1.png │ │ ├── shift_spectrum.png │ │ ├── sine_table (1).png │ │ ├── sine_table (2).png │ │ ├── sine_table.png │ │ ├── sph0645lm4h_mic_timing.png │ │ ├── sph0645lm4h_pins.png │ │ ├── sph0645lm4h_wiring.png │ │ ├── stm32f072_extensions (1).png │ │ ├── stm32f072_extensions (2).png │ │ ├── stm32f072_extensions.png │ │ ├── stoppreviousconfig (1).png │ │ ├── stoppreviousconfig (2).png │ │ ├── stoppreviousconfig.png │ │ ├── sw4stm32.png │ │ ├── taper_window (1).png │ │ ├── taper_window (2).png │ │ ├── taper_window.png │ │ ├── viz_buffer (1).png │ │ ├── viz_buffer (2).png │ │ ├── viz_buffer.png │ │ ├── welcome_page.PNG │ │ ├── whatchexpression (1).png │ │ ├── whatchexpression-1.png │ │ ├── whatchexpression.png │ │ ├── windows_install.png │ │ ├── windows_install_1.PNG │ │ ├── windows_install_4.PNG │ │ ├── windows_install_5.PNG │ │ ├── windows_overlap (1).png │ │ ├── windows_overlap (2).png │ │ ├── windows_overlap.png │ │ ├── windows_running_software.PNG │ │ ├── wiring.png │ │ ├── word.png │ │ ├── words-mono.png │ │ ├── zplot_high_pass (1).png │ │ ├── zplot_high_pass (2).png │ │ ├── zplot_high_pass-1 (1).png │ │ ├── zplot_high_pass-1 (2).png │ │ ├── zplot_high_pass-1.png │ │ └── zplot_high_pass.png ├── README.md ├── SUMMARY.md ├── alien-voice │ ├── README.md │ ├── dsp_tips.md │ ├── effect_description.md │ ├── implementation.md │ └── python.md ├── bom.md ├── dft │ ├── README.md │ ├── figs │ │ ├── clarinet_spectrum.png │ │ └── shift_spectrum.png │ ├── implementation.md │ └── theory.md ├── filter-design │ ├── README.md │ ├── approaches.md │ ├── figs │ │ ├── biquad_direct_1_wiki.png │ │ ├── biquad_direct_2_wiki.png │ │ ├── direct_form_1_complete.png │ │ ├── direct_form_1_incomplete.png │ │ ├── direct_form_2_complete.png │ │ ├── direct_form_2_incomplete.png │ │ ├── filter_classification.png │ │ ├── fir_321.png │ │ ├── fir_41.png │ │ ├── fir_comparison.png │ │ ├── fir_filter.png │ │ ├── hpf_comparison.png │ │ ├── iir_comparison.png │ │ ├── iir_single_stage.png │ │ ├── iir_varying_pole.png │ │ ├── moving_average.png │ │ ├── offset_hpf.png │ │ ├── original_hpf.png │ │ └── original_offset.png │ └── implementation.md ├── granular-synthesis │ ├── README.md │ ├── effect_description.md │ └── implementation.md ├── installation │ ├── README.md │ ├── hardware.md │ ├── instructions.md │ └── software │ │ ├── README.md │ │ ├── cubemx.md │ │ ├── eclipse_tips.md │ │ └── sw4stm32.md ├── intro.jpg ├── linear-prediction │ ├── README.md │ ├── figs │ │ ├── energy_comparison.png │ │ ├── energy_gs_lpc.png │ │ ├── energy_problem.png │ │ ├── equation_system.png │ │ └── lpc.jpg │ ├── implementation.md │ ├── lec13.pdf │ └── theory.md └── passthrough │ ├── README.md │ ├── audio-io │ ├── README.md │ ├── dac.md │ └── microphone.md │ ├── coding.md │ ├── updating_stm32_peripherals.md │ └── wiring.md └── scripts ├── _templates ├── rt_simulated.py ├── rt_sounddevice.py └── speech.wav ├── alien_voice ├── alien_voice_effect_200Hz.wav ├── alien_voice_effect_incomplete.py ├── alien_voice_sounddevice_incomplete.py ├── compute_sinusoid_lookup.py ├── discontinuous_block_sines.py ├── plot_zplane.py ├── simple_high_pass.py └── utils.py ├── dft ├── clarinet_D4.wav ├── clarinet_D5.wav ├── dft_pitch_shift_incomplete.py ├── dft_pitch_shift_sounddevice.py ├── dft_shift_example.py ├── plot_clarinet_spectrum.py └── utils_dft.py ├── filter_design ├── biquad_direct_form_1_incomplete.py ├── biquad_direct_form_2_incomplete.py ├── fir_comparison.py ├── fir_comparison_example.py ├── hpf_comparison.py ├── iir_comparison.py ├── moving_average_approach.py ├── show_simple_filter_flaw.py ├── utils.py └── varying_single_pole.py ├── granular_synthesis ├── grains_viz.py ├── granular_synthesis_incomplete.py ├── granular_synthesis_sounddevice_incomplete.py ├── resample_viz.py ├── utils.py ├── variable_sharing_viz.py └── windowing_viz.py └── linear_prediction ├── compare_spectrum.py ├── compare_spectrum_lpc.py ├── granular_synthesis_LPC_incomplete.py ├── granular_synthesis_LPC_sounddevice_incomplete.py ├── test_lpc_utils.py ├── utils.py ├── utils_lpc.py ├── voiced.wav ├── voiced_gran_synth.wav └── voiced_gran_synth_lpc.wav /.gitignore: -------------------------------------------------------------------------------- 1 | # Node rules: 2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 3 | .grunt 4 | 5 | ## Dependency directory 6 | ## Commenting this out is preferred by some people, see 7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git 8 | node_modules 9 | 10 | # Book build output 11 | _book 12 | 13 | # eBook build output 14 | *.epub 15 | *.mobi 16 | *.pdf 17 | 18 | *.DS_Store 19 | 20 | # gitbook, https://github.com/github/gitignore/blob/master/GitBook.gitignore 21 | _book 22 | node_modules 23 | .grunt 24 | scripts/*png 25 | scripts/*pdf 26 | 27 | # Byte-compiled / optimized / DLL files 28 | __pycache__/ 29 | *.py[cod] 30 | *$py.class 31 | 32 | # C extensions 33 | *.so 34 | 35 | # Distribution / packaging 36 | .Python 37 | build/ 38 | develop-eggs/ 39 | dist/ 40 | downloads/ 41 | eggs/ 42 | .eggs/ 43 | lib/ 44 | lib64/ 45 | parts/ 46 | sdist/ 47 | var/ 48 | wheels/ 49 | *.egg-info/ 50 | .installed.cfg 51 | *.egg 52 | MANIFEST 53 | 54 | # PyInstaller 55 | # Usually these files are written by a python script from a template 56 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 57 | *.manifest 58 | *.spec 59 | 60 | # Installer logs 61 | pip-log.txt 62 | pip-delete-this-directory.txt 63 | 64 | # Unit test / coverage reports 65 | htmlcov/ 66 | .tox/ 67 | .coverage 68 | .coverage.* 69 | .cache 70 | nosetests.xml 71 | coverage.xml 72 | *.cover 73 | .hypothesis/ 74 | .pytest_cache/ 75 | 76 | # Translations 77 | *.mo 78 | *.pot 79 | 80 | # Django stuff: 81 | *.log 82 | local_settings.py 83 | db.sqlite3 84 | 85 | # Flask stuff: 86 | instance/ 87 | .webassets-cache 88 | 89 | # Scrapy stuff: 90 | .scrapy 91 | 92 | # Sphinx documentation 93 | docs/_build/ 94 | 95 | # PyBuilder 96 | target/ 97 | 98 | # Jupyter Notebook 99 | .ipynb_checkpoints 100 | 101 | # pyenv 102 | .python-version 103 | 104 | # celery beat schedule file 105 | celerybeat-schedule 106 | 107 | # SageMath parsed files 108 | *.sage.py 109 | 110 | # Environments 111 | .env 112 | .venv 113 | env/ 114 | venv/ 115 | ENV/ 116 | env.bak/ 117 | venv.bak/ 118 | 119 | # Spyder project settings 120 | .spyderproject 121 | .spyproject 122 | 123 | # Rope project settings 124 | .ropeproject 125 | 126 | # mkdocs documentation 127 | /site 128 | 129 | # mypy 130 | .mypy_cache/ 131 | 132 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Audiovisual Communications Laboratory 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Practical Digital Signal Processing Through Voice Effects 2 | 3 | **By [Eric Bezzam](https://ebezzam.github.io/), [Adrien Hoffet](https://lcav.epfl.ch/people/people-current_staff/page-145331-en-html/), and [Paolo Prandoni](https://lcav.epfl.ch/people/people-current_staff/people-paolo-prandoni/)** 4 | 5 | This repository contains the content and scripts for the [practical exercises](https://lcav.gitbook.io/dsp-labs/) for the EPFL course [COM-303, Signal processing for communications](http://isa.epfl.ch/imoniteur_ISAP/!itffichecours.htm?ww_i_matiere=24007074&ww_x_anneeacad=1866893861&ww_i_section=944590&ww_i_niveau=6683147&ww_c_langue=en). 6 | 7 | The material in this book is based off of the voice effects presented in [this Jupyter notebook](https://nbviewer.jupyter.org/github/prandoni/COM303-Py3/blob/master/VoiceTransformer/VoiceTransformer.ipynb). 8 | However, the focus is on implementing these effects in a real-time manner: first in Python with a laptop's soundcard 9 | then in C with a microcontroller from ST Microelectronics. 10 | 11 | ***The goal of these exercises is to expose participants to the practical sides of digital signal processing (DSP) through 12 | fun and intuitive audio applications***, while also using industry-level tools that are low-cost and accessible so that others 13 | around the world can try them out. 14 | 15 | Even if the [hardware](https://lcav.gitbook.io/dsp-labs/bom) cannot be obtained, the main lessons in DSP can still be 16 | acquired in Python with your laptop! In this case, you can skip ahead to Chapter 3, but we do recommend reading 17 | [Section 2.1](https://lcav.gitbook.io/dsp-labs/passthrough/audio-io) on Audio I/O theory. Moreover, you can implement 18 | the various voice effects without downloading this repository locally by checking out 19 | [this Colaboratory notebook](https://colab.research.google.com/drive/1J9QtFfqmk_qMmO4Yjaq_6wUD5D0aWYyt). Note that you 20 | will need a Gmail account to run the edit/run the cells in the cloud; otherwise, you can download the notebook and run 21 | it locally. 22 | 23 | Table of contents: 24 | 25 | 1. [Overview and installation of ST Microelectronics material](https://lcav.gitbook.io/dsp-labs/installation) 26 | 2. [Audio passthrough](https://lcav.gitbook.io/dsp-labs/passthrough) 27 | 3. [Alien voice effect](https://lcav.gitbook.io/dsp-labs/alien-voice) 28 | 4. [Digital filter design](https://lcav.gitbook.io/dsp-labs/filter-design) 29 | 5. [Granular synthesis pitch shifting](https://lcav.gitbook.io/dsp-labs/granular-synthesis) 30 | 6. [Linear predictive coding](https://lcav.gitbook.io/dsp-labs/linear-prediction) 31 | 7. [DFT-based pitch shifting](https://lcav.gitbook.io/dsp-labs/dft) 32 | 33 | To set up the book for local development or to suggest changes (more than welcome!), check out the [setup guide](https://github.com/LCAV/dsp-labs/blob/master/SETUP.md). 34 | 35 | If you use this material in your own work, please cite [our paper](https://infoscience.epfl.ch/record/258046/files/dsp_labs_icassp_2019.pdf). 36 | 37 | > E. Bezzam, A. Hoffet, P. Prandoni, *Teaching Practical DSP with Off-the-Shelf Hardware and Free Software*, Proc. IEEE ICASSP, Brighton, UK, 2019. 38 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": "./docs", 3 | "plugins": ["mathjax@https://github.com/OrgVue/gitbook-plugin-mathjax.git#speech-fix", 4 | "expandable-chapters", "hints", "simple-page-toc"], 5 | "links": { 6 | "sidebar": { 7 | "Course info": "http://isa.epfl.ch/imoniteur_ISAP/!itffichecours.htm?ww_i_matiere=24007074&ww_x_anneeacad=1866893861&ww_i_section=944590&ww_i_niveau=6683147&ww_c_langue=en", 8 | "Contact": "mailto:ebezzam@gmail.com;adrien.hoffet@epfl.ch?subject=[DSP labs]" 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /docs/.gitbook/assets/0_opening.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/0_opening.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/10_close_installer (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/10_close_installer (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/10_close_installer.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/10_close_installer.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/10_enter_pwd_rules (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/10_enter_pwd_rules (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/10_enter_pwd_rules.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/10_enter_pwd_rules.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/10_nvic_dmas_enabled_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/10_nvic_dmas_enabled_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/11_close_installer (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/11_close_installer (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/11_close_installer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/11_close_installer.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/11_workspace (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/11_workspace (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/11_workspace.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/11_workspace.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/12_project_settings_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/12_project_settings_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/12_select_workspace_1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/12_select_workspace_1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/12_select_workspace_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/12_select_workspace_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/12_sw4stm32 (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/12_sw4stm32 (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/12_sw4stm32.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/12_sw4stm32.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/13_generate_success_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/13_generate_success_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/13_sw4stm32 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/13_sw4stm32 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/13_sw4stm32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/13_sw4stm32.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/14_import.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/14_import.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/15_existing_project.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/15_existing_project.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/17_select_project.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/17_select_project.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/18_workspace (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/18_workspace (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/18_workspace (2).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/18_workspace (2).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/18_workspace.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/18_workspace.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/19_successful_build (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/19_successful_build (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/19_successful_build (2).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/19_successful_build (2).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/19_successful_build.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/19_successful_build.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_get_software-1 (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_get_software-1 (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_get_software-1-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_get_software-1-1.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_get_software-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_get_software-1.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_initial_linux (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_initial_linux (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_initial_linux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_initial_linux.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_initial_win (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_initial_win (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_initial_win.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_initial_win.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/1_new_proj.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/1_new_proj.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/20_debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/20_debug.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/22_enter_debug_perspective (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/22_enter_debug_perspective (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/22_enter_debug_perspective (2).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/22_enter_debug_perspective (2).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/22_enter_debug_perspective.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/22_enter_debug_perspective.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_led_blinking (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_led_blinking (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_led_blinking (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_led_blinking (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_led_blinking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_led_blinking.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_resume (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_resume (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_resume (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_resume (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_resume (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_resume (3).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_resume-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_resume-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_resume-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_resume-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/24_resume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/24_resume.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/25_disconnect_1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/25_disconnect_1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/25_disconnect_1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/25_disconnect_1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/25_disconnect_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/25_disconnect_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/26_switch_perspective_1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/26_switch_perspective_1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/26_switch_perspective_1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/26_switch_perspective_1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/26_switch_perspective_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/26_switch_perspective_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/2_filter_board.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/2_filter_board.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/2_installation_path (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/2_installation_path (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/2_installation_path.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/2_installation_path.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/3_board_loaded_1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/3_board_loaded_1.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/4_create_shortcuts (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/4_create_shortcuts (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/4_create_shortcuts.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/4_create_shortcuts.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/4_enable_i2s.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/4_enable_i2s.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/5_config_tab.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/5_config_tab.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/5_confirm (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/5_confirm (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/5_confirm.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/5_confirm.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/5_specify_path (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/5_specify_path (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/5_specify_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/5_specify_path.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/7_driver_setup (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/7_driver_setup (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/7_driver_setup.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/7_driver_setup.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/7_i2s1_dma_settings.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/7_i2s1_dma_settings.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/7_select_packs (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/7_select_packs (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/7_select_packs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/7_select_packs.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/8_confirm_packs (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/8_confirm_packs (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/8_confirm_packs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/8_confirm_packs.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/8_driver_setup_complete (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/8_driver_setup_complete (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/8_driver_setup_complete.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/8_driver_setup_complete.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/9_finish_installation (1).PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/9_finish_installation (1).PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/9_finish_installation.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/9_finish_installation.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/9_i2s2_dma_settings.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/9_i2s2_dma_settings.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/9_installation_done (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/9_installation_done (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/9_installation_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/9_installation_done.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/activate_the_clock_for_tim2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/activate_the_clock_for_tim2.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/adafruit_products_3678_top_orig.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/adafruit_products_3678_top_orig.jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/biquad_direct_1_wiki-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/biquad_direct_1_wiki-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/biquad_direct_1_wiki-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/biquad_direct_1_wiki-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/biquad_direct_1_wiki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/biquad_direct_1_wiki.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/biquad_direct_2_wiki-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/biquad_direct_2_wiki-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/biquad_direct_2_wiki-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/biquad_direct_2_wiki-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/biquad_direct_2_wiki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/biquad_direct_2_wiki.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/block_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/block_diagram.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/clarinet_spectrum-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/clarinet_spectrum-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/clarinet_spectrum-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/clarinet_spectrum-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/clarinet_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/clarinet_spectrum.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/config_tab-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/config_tab-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/cubemx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/cubemx.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/debug_config_menu (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/debug_config_menu (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/debug_config_menu-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/debug_config_menu-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/debug_config_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/debug_config_menu.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/debug_config_old_name (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/debug_config_old_name (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/debug_config_old_name (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/debug_config_old_name (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/debug_config_old_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/debug_config_old_name.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_1_complete (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_1_complete (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_1_complete-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_1_complete-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_1_complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_1_complete.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_1_incomplete-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_1_incomplete-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_1_incomplete-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_1_incomplete-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_1_incomplete-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_1_incomplete-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_2_complete (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_2_complete (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_2_complete-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_2_complete-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_2_complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_2_complete.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_2_incomplete-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_2_incomplete-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_2_incomplete-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_2_incomplete-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/direct_form_2_incomplete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/direct_form_2_incomplete.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/discontinuous_sine (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/discontinuous_sine (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/discontinuous_sine (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/discontinuous_sine (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/discontinuous_sine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/discontinuous_sine.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/doubling_continuous (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/doubling_continuous (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/doubling_continuous (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/doubling_continuous (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/doubling_continuous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/doubling_continuous.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/doubling_discontinuity (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/doubling_discontinuity (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/doubling_discontinuity (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/doubling_discontinuity (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/doubling_discontinuity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/doubling_discontinuity.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/energy_gs_lpc (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/energy_gs_lpc (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/energy_gs_lpc-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/energy_gs_lpc-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/energy_gs_lpc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/energy_gs_lpc.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/energy_problem-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/energy_problem-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/energy_problem-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/energy_problem-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/energy_problem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/energy_problem.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/equation_system (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/equation_system (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/equation_system-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/equation_system-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/equation_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/equation_system.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/errorstoppreviousconfig_enlarged (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/errorstoppreviousconfig_enlarged (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/errorstoppreviousconfig_enlarged-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/errorstoppreviousconfig_enlarged-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/errorstoppreviousconfig_enlarged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/errorstoppreviousconfig_enlarged.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/filter_classification-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/filter_classification-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/filter_classification-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/filter_classification-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/filter_classification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/filter_classification.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/final_wiring.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/final_wiring.jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_321-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_321-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_321-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_321-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_321.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_321.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_41-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_41-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_41-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_41-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_41-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_41-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_comparison (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_comparison (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_comparison (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_comparison (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_comparison.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_filter-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_filter-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_filter-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_filter-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/fir_filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/fir_filter-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_2 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_2 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_2 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_2 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_2.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_3 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_3 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_3 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_3 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_3.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_4 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_4 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_4 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_4 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_4.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/firmware_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/firmware_5.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass_log (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass_log (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass_log (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass_log (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass_log-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass_log-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass_log-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass_log-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass_log-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass_log-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/freq_resp_high_pass_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/freq_resp_high_pass_log.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/hpf_comparison-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/hpf_comparison-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/hpf_comparison-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/hpf_comparison-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/hpf_comparison-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/hpf_comparison-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/i2s_timing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/i2s_timing.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/iir_comparison-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/iir_comparison-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/iir_comparison-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/iir_comparison-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/iir_comparison-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/iir_comparison-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/iir_varying_pole-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/iir_varying_pole-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/iir_varying_pole-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/iir_varying_pole-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/iir_varying_pole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/iir_varying_pole.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/intro (1).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/intro (1).jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/intro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/intro.jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/linux_installation_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/linux_installation_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/linux_installation_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/linux_installation_3.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/linux_installation_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/linux_installation_4.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/linux_installation_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/linux_installation_5.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/linux_running_software.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/linux_running_software.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/lpc (1).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/lpc (1).jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/lpc-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/lpc-1.jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/lpc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/lpc.jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_1-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_1-1-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_10.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_11 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_11 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_11.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_12.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_1_1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_1_2.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_2.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_4 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_4 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_4.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_5.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_6-1-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_6-1-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_6-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_6-1-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_6.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_7-1-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_7-1-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_7-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_7-1-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_7.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_install_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_install_9.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/mac_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/mac_run.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/moving_average-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/moving_average-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/moving_average-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/moving_average-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/moving_average-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/moving_average-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/nucleo_board.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/nucleo_board.jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/offset_hpf (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/offset_hpf (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/offset_hpf (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/offset_hpf (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/offset_hpf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/offset_hpf.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/original_hpf-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/original_hpf-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/original_hpf-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/original_hpf-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/original_hpf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/original_hpf.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/original_offset (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/original_offset (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/original_offset (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/original_offset (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/original_offset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/original_offset.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/pinning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/pinning.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/pinout_tab (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/pinout_tab (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/pinout_tab (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/pinout_tab (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/pinout_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/pinout_tab.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/proj_prop-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/proj_prop-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-12.14.38-2 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-12.14.38-2 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-12.14.38-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-12.14.38-2-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-12.14.38-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-12.14.38-2.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-12.18.18 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-12.18.18 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-12.18.18 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-12.18.18 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-12.18.18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-12.18.18.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-15.54.25-2-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-15.54.25-2-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-15.54.25-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-15.54.25-2-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.06.48 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.06.48 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.06.48-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.06.48-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.06.48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.06.48.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.07.27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.07.27.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.42.06 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.42.06 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.42.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.42.06.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.04 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.04 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.04.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.19 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.19 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.19.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.51.49.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.53.06.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.24 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.24 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.24.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.49-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.49-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.49-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-09-25-at-17.54.49-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-01-at-11.34.37 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-01-at-11.34.37 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-01-at-11.34.37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-01-at-11.34.37.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-01-at-11.36.27 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-01-at-11.36.27 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-01-at-11.36.27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-01-at-11.36.27.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-01-at-11.37.05 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-01-at-11.37.05 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-01-at-11.37.05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-01-at-11.37.05.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-13.36.57 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-13.36.57 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-13.36.57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-13.36.57.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-13.39.21 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-13.39.21 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-13.39.21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-13.39.21.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-13.58.37 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-13.58.37 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-13.58.37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-13.58.37.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-14.05.00 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-14.05.00 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-14.05.00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-14.05.00.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-14.52.49 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-14.52.49 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-14.52.49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-14.52.49.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.06.44 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.06.44 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.06.44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.06.44.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.11.56 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.11.56 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.11.56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.11.56.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.15.01 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.15.01 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.15.01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.15.01.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.36.36 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.36.36 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.36.36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.36.36.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.42.23 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.42.23 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.42.23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.42.23.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.43.06 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.43.06 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.43.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.43.06.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.46.31 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.46.31 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-07-at-15.46.31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-07-at-15.46.31.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.27.39 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.27.39 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.27.39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.27.39.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.32 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.32 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.32.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.58 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.58 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.29.58.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.32.28 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.32.28 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.32.28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.32.28.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.57.46 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.57.46 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.57.46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.57.46.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.58.09 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.58.09 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/screenshot-2019-10-10-at-16.58.09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/screenshot-2019-10-10-at-16.58.09.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sensors_3421_quarter_orig.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sensors_3421_quarter_orig.jpg -------------------------------------------------------------------------------- /docs/.gitbook/assets/setup_tim2_as_us_timebase_edited-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/setup_tim2_as_us_timebase_edited-1-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/shift_spectrum (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/shift_spectrum (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/shift_spectrum-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/shift_spectrum-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/shift_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/shift_spectrum.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sine_table (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sine_table (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sine_table (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sine_table (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sine_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sine_table.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sph0645lm4h_mic_timing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sph0645lm4h_mic_timing.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sph0645lm4h_pins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sph0645lm4h_pins.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sph0645lm4h_wiring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sph0645lm4h_wiring.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/stm32f072_extensions (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/stm32f072_extensions (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/stm32f072_extensions (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/stm32f072_extensions (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/stm32f072_extensions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/stm32f072_extensions.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/stoppreviousconfig (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/stoppreviousconfig (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/stoppreviousconfig (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/stoppreviousconfig (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/stoppreviousconfig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/stoppreviousconfig.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/sw4stm32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/sw4stm32.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/taper_window (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/taper_window (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/taper_window (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/taper_window (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/taper_window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/taper_window.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/viz_buffer (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/viz_buffer (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/viz_buffer (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/viz_buffer (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/viz_buffer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/viz_buffer.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/welcome_page.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/welcome_page.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/whatchexpression (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/whatchexpression (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/whatchexpression-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/whatchexpression-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/whatchexpression.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/whatchexpression.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_install.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_install_1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_install_1.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_install_4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_install_4.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_install_5.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_install_5.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_overlap (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_overlap (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_overlap (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_overlap (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_overlap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_overlap.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/windows_running_software.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/windows_running_software.PNG -------------------------------------------------------------------------------- /docs/.gitbook/assets/wiring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/wiring.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/word.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/word.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/words-mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/words-mono.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/zplot_high_pass (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/zplot_high_pass (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/zplot_high_pass (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/zplot_high_pass (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/zplot_high_pass-1 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/zplot_high_pass-1 (1).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/zplot_high_pass-1 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/zplot_high_pass-1 (2).png -------------------------------------------------------------------------------- /docs/.gitbook/assets/zplot_high_pass-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/zplot_high_pass-1.png -------------------------------------------------------------------------------- /docs/.gitbook/assets/zplot_high_pass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/.gitbook/assets/zplot_high_pass.png -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Initial page 2 | 3 | -------------------------------------------------------------------------------- /docs/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Table of contents 2 | 3 | * [Initial page](README.md) 4 | 5 | -------------------------------------------------------------------------------- /docs/alien-voice/README.md: -------------------------------------------------------------------------------- 1 | # 3. ALIEN VOICE EFFECT 2 | 3 | In this exercise, we will create a simple voice effect, namely taking the microphone's input 4 | signal and producing an "alien" version of it. During the implementation, we will come across 5 | a few limitations that arise when trying to realize digital signal processing \(DSP\) in 6 | real-time. 7 | 8 | In [Section 3.1](effect_description.md), we will explain the effect that we will be 9 | implementing. In [Section 3.2](dsp_tips.md), we will discuss some important points that need 10 | to be considered when implementing real-time DSP. In [Section 3.3](python.md), we propose a 11 | Python framework for simulating a real-time environment with your laptop's sound card the 12 | [`sounddevice`](http://python-sounddevice.readthedocs.io/) library. Finally, we will guide 13 | you through the implementation on the STM32 board in [Section 3.4](implementation.md). 14 | 15 | As in the previous chapter, text contained in highlighted boxes, as shown below, will require ***you*** to determine the appropriate solution and implementation. 16 | 17 | {% hint style="info" %} 18 | TASK: This is a task for you! 19 | {% endhint %} 20 | 21 | ```text 22 | . . . . . . . . . + . 23 | . . : . .. :. .___---------___. 24 | . . . . :.:. _".^ .^ ^. '.. :"-_. . 25 | . : . . .:../: . .^ :.:\. 26 | . . :: +. :.:/: . . . . . .:\ 27 | . : . . _ :::/: . ^ . . .:\ 28 | .. . . . - : :.:./. . .:\ 29 | . . . :..|: . . ^. .:| 30 | . . : : ..|| . . . !:| 31 | . . . . ::. ::\( . :)/ 32 | . . : . : .:.|. ###### .#######::| 33 | :.. . :- : .: ::|.####### ..########:| 34 | . . . .. . .. :\ ######## :######## :/ 35 | . .+ :: : -.:\ ######## . ########.:/ 36 | . .+ . . . . :.:\. ####### #######..:/ 37 | :: . . . . ::.:..:.\ . . ..:/ 38 | . . . .. : -::::.\. | | . .:/ 39 | . : . . .-:.":.::.\ ..:/ 40 | . -. . . . .: .:::.:.\. .:/ 41 | . . . : : ....::_:..:\ ___. :/ 42 | . . . .:. .. . .: :.:.:\ :/ 43 | + . . : . ::. :.:. .:.|\ .:/| 44 | . + . . ...:: ..| --.:| 45 | . . . . . . . ... :..:.."( ..)" 46 | . . . : . .: ::/ . .::\ 47 | ``` 48 | 49 | [Source](http://www.asciiworld.com/-Aliens,128-.html). 50 | 51 | -------------------------------------------------------------------------------- /docs/alien-voice/effect_description.md: -------------------------------------------------------------------------------- 1 | # 3.1 How it works 2 | 3 | The alien voice effect that we will be creating is done by simply using _sinusoidal modulation_ to shift the voice spectrum up. In communications terminology, this is often called _amplitude modulation_ \(or AM for short\). 4 | 5 | Given a modulation frequency $$f_{mod}$$ \(in Hz\) and an input sample $$x[n]$$ we can compute each output sample $$y[n]$$ as such: 6 | 7 | $$ 8 | y[n] = x[n] \cdot \sin(2 \pi \cdot (f_{mod} / f_s) \cdot n), 9 | $$ 10 | 11 | where $$f_s$$ is the sampling frequency \(in Hz\) and $$n$$ is the time index of the samples that are taken at regular intervals of $$1/f_s$$. From now on, we will denote $$2 \pi \cdot (f_{mod} / f_s)$$ with $$\omega_{mod}$$, which represents the corresponding _normalized_ frequency for $$f_{mod}$$ given $$f_s$$. 12 | 13 | The modulation frequency must be kept small in order to preserve intelligibility as the resulting signal will be affected by _aliasing_ due to the process of shifting up the spectrum \(and maintaining the same sampling frequency\). 14 | 15 | We recommend downloading [this IPython notebook](https://github.com/prandoni/COM303-Py3/blob/master/VoiceTransformer/VoiceTransformer.ipynb) from GitHub. Under the section entitled `"1 - The Robot Voice"`, you can hear this simple voice effect applied to a sample audio file. You can also modify the modulation frequency to hear how it affects the output and the spectrum due to aliasing. You can also preview the notebook and listen to the effect without downloading it by heading over to [nbviewer](https://nbviewer.jupyter.org/github/prandoni/COM303-Py3/blob/master/VoiceTransformer/VoiceTransformer.ipynb). 16 | 17 | As mentioned in the IPython notebook above, this voice transformer is great for real-time applications as it is very cheap, consisting of only one multiplication per sample. However, the intelligibility can be quite poor due to aliasing. In the next chapter, we will implement a more sophisticated voice transformer, namely [pitch shifting with granular synthesis](../granular-synthesis/). Nevertheless, this simple exercise will already expose us to some important practical DSP "tricks" in order to implement a real-time version of this effect. 18 | 19 | -------------------------------------------------------------------------------- /docs/bom.md: -------------------------------------------------------------------------------- 1 | # BILL OF MATERIALS 2 | 3 | The following materials are needed: 4 | 5 | * [STM32 NUCLEO-F072RB](https://www.st.com/en/evaluation-tools/nucleo-f072rb.html) 6 | * [USB cable - 6" A/MiniB](https://www.adafruit.com/product/899) 7 | * [Adafruit I2S MEMS Microphone Breakout](https://www.adafruit.com/product/3421) 8 | * [Adafruit I2S Stereo Decoder](https://www.adafruit.com/product/3678) 9 | * [Jumper Wires](https://www.adafruit.com/product/266) 10 | 11 | In principle, any board from STM32 can be used for these exercises, as long as it is supported by [CubeMX](https://www.st.com/en/development-tools/stm32cubemx.html), [System Workbench](https://www.st.com/en/development-tools/sw4stm32.html), and supports at least two I2S buses. 12 | 13 | -------------------------------------------------------------------------------- /docs/dft/README.md: -------------------------------------------------------------------------------- 1 | # 7. DFT PITCH SHIFTING 2 | 3 | In this chapter, we consider pitch shifting in the **frequency domain** by performing the _Discrete Fourier Transform_ (DFT). As the pitch is strongly related to frequency, it is quite intuitive what operation needs to be done in this domain, namely shift the spectrum up or down. However, as mentioned in the previous chapter, we wish to preserve a certain structure in the spectrum. 4 | 5 | [Section 7.1](theory.md) explains the operations that need to be performed for DFT pitch shifting and the motivation behind them, while [Section 7.2](implementation.md) guides you through implementing this approach in Python. 6 | 7 | With this effect, we will be creating a chipmunk-like voice effect; so no need to inhale helium! 8 | 9 | Text contained in highlighted boxes, as shown below, are tasks for ***you***. 10 | {% hint style="info" %} 11 | TASK: This is a task for you! 12 | {% endhint %} 13 | 14 | 15 | ``` 16 | _ 17 | .-'` `} 18 | _./) / } 19 | .'o \ | } 20 | '.___.'`.\ {` 21 | /`\_/ , `. } 22 | \=' .-' _`\ { 23 | `'`;/ `, } 24 | _\ ; } 25 | /__`;-...'--' 26 | 27 | ``` 28 | 29 | [Source](http://www.heartnsoul.com/ascii_art/squirrels.txt). 30 | 31 | -------------------------------------------------------------------------------- /docs/dft/figs/clarinet_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/dft/figs/clarinet_spectrum.png -------------------------------------------------------------------------------- /docs/dft/figs/shift_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/dft/figs/shift_spectrum.png -------------------------------------------------------------------------------- /docs/filter-design/README.md: -------------------------------------------------------------------------------- 1 | # 4. DIGITAL FILTER DESIGN 2 | 3 | In the previous exercise, we used a very simple filter in order to remove the 4 | DC offset. Although the applied filter does the necessary job, it also removes 5 | frequencies of interest! Try running the Python script with and without this 6 | simple high pass filter (HPF), and you'll notice a lot of the lower frequencies 7 | of the voice are removed when applying this filter. 8 | 9 | This motivates the design and use of a filter with a sharper [slope/roll-off](https://en.wikipedia.org/wiki/Roll-off). 10 | In this chapter, we approach this task in order to replace the simplistic 11 | filter used earlier. After all, no DSP module is complete without a section on 12 | filter design! 13 | 14 | As before, text contained in highlighted boxes are tasks for ***you***! 15 | 16 | {% hint style="info" %} 17 | TASK: This is a task for you! 18 | {% endhint %} 19 | -------------------------------------------------------------------------------- /docs/filter-design/figs/biquad_direct_1_wiki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/biquad_direct_1_wiki.png -------------------------------------------------------------------------------- /docs/filter-design/figs/biquad_direct_2_wiki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/biquad_direct_2_wiki.png -------------------------------------------------------------------------------- /docs/filter-design/figs/direct_form_1_complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/direct_form_1_complete.png -------------------------------------------------------------------------------- /docs/filter-design/figs/direct_form_1_incomplete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/direct_form_1_incomplete.png -------------------------------------------------------------------------------- /docs/filter-design/figs/direct_form_2_complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/direct_form_2_complete.png -------------------------------------------------------------------------------- /docs/filter-design/figs/direct_form_2_incomplete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/direct_form_2_incomplete.png -------------------------------------------------------------------------------- /docs/filter-design/figs/filter_classification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/filter_classification.png -------------------------------------------------------------------------------- /docs/filter-design/figs/fir_321.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/fir_321.png -------------------------------------------------------------------------------- /docs/filter-design/figs/fir_41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/fir_41.png -------------------------------------------------------------------------------- /docs/filter-design/figs/fir_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/fir_comparison.png -------------------------------------------------------------------------------- /docs/filter-design/figs/fir_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/fir_filter.png -------------------------------------------------------------------------------- /docs/filter-design/figs/hpf_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/hpf_comparison.png -------------------------------------------------------------------------------- /docs/filter-design/figs/iir_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/iir_comparison.png -------------------------------------------------------------------------------- /docs/filter-design/figs/iir_single_stage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/iir_single_stage.png -------------------------------------------------------------------------------- /docs/filter-design/figs/iir_varying_pole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/iir_varying_pole.png -------------------------------------------------------------------------------- /docs/filter-design/figs/moving_average.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/moving_average.png -------------------------------------------------------------------------------- /docs/filter-design/figs/offset_hpf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/offset_hpf.png -------------------------------------------------------------------------------- /docs/filter-design/figs/original_hpf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/original_hpf.png -------------------------------------------------------------------------------- /docs/filter-design/figs/original_offset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/filter-design/figs/original_offset.png -------------------------------------------------------------------------------- /docs/granular-synthesis/README.md: -------------------------------------------------------------------------------- 1 | # 5. GRANULAR SYNTHESIS 2 | 3 | In this exercise, we will implement a more sophisticated voice transformation with 4 | [granular synthesis](https://en.wikipedia.org/wiki/Granular_synthesis). Although the alien 5 | voice does a good job in altering the voice, it can severely harm intelligibility due to 6 | aliasing and can only be used for shifting the pitch up. With granular synthesis, 7 | intelligibility will not be so significantly affected _and_ we can shift the pitch down to 8 | create a Darth Vader voice. 9 | 10 | In [Section 5.1](effect_description.md), we will briefly explain how we will be performing 11 | pitch shifting with granular synthesis. As for the alien voice effect, we will _prototype_ 12 | the implementation in Python by simulating a real-time environment that receives samples in 13 | a buffer-based fashion. This should minimize the amount of errors when implementing the voice 14 | transformation in C on an embedded device. We will guide you through the Python implementation 15 | in [Section 5.2](implementation.md). 16 | 17 | As in the previous chapter, text contained in highlighted boxes, as shown below, will require 18 | ***you*** to determine the appropriate solution and implementation. 19 | 20 | {% hint style="info" %} 21 | TASK: This is a task for you! 22 | {% endhint %} 23 | 24 | May the Force be with you! 25 | 26 | ```text 27 | _.-'~~~~~~~~~~~~`-._ 28 | / || \ 29 | / || \ 30 | | || | 31 | | __________||__________| 32 | |/ -------- \/ ------- \| 33 | / ( ) ( ) \ 34 | / \ ----- () ----- / \ 35 | / \ /||\ / \ 36 | / \ /||||\ / \ 37 | / \ /||||||\ / \ 38 | /_ \o=============o/ _\ 39 | `--...__|`-._ _.-'|__...--' 40 | | `-----' | 41 | ``` 42 | 43 | _Figure: Modified from_ [here](http://www.ascii-art.de/ascii/s/starwars.txt). 44 | 45 | -------------------------------------------------------------------------------- /docs/installation/README.md: -------------------------------------------------------------------------------- 1 | # 1. OVERVIEW AND INSTALLATION 2 | 3 | First things first, we will go over the hardware and software for these 4 | exercises. 5 | 6 | The board we will be using is from STMicroelectronics \(often abbreviated 7 | as ST\). ST provides many development boards that allow hobbyists, students, 8 | and even professionals prototype countless applications. In our exercises, we will 9 | be using the ST board to interface with a microphone for input and a digital-to-analog 10 | converter \(DAC\) for output. We will present these devices and our ST board in 11 | [Section 1.1](hardware.md). 12 | 13 | In order to facilitate the development of applications, ST partners with 14 | third-party companies that provide integrated development environments 15 | \(IDEs\) for their boards. These tools can sometimes be overwhelming as 16 | they allow a lot of customization, but they are meant to help you! 17 | Attention to detail and reading the documentation will help you in your 18 | successful workflow. More on these tools and their installation will be 19 | covered in [Section 1.2](software/). 20 | 21 | In [Section 1.3](instructions.md), we will combine the hardware and software 22 | to build our first project! 23 | 24 | -------------------------------------------------------------------------------- /docs/installation/hardware.md: -------------------------------------------------------------------------------- 1 | # 1.1 Hardware 2 | 3 | In this section, we introduce the different hardware components that will be 4 | used in our lab exercises: 5 | 6 | * [Microcontroller](hardware.md#microcontroller) 7 | * [Microphone](hardware.md#microphone) 8 | * [DAC + audio jack](hardware.md#dac_jack) 9 | 10 | Both the microphone and the DAC will rely on the I2S \(Inter-IC Sound\) 11 | bus specification for audio transfer. This is a 3-line serial bus consisting 12 | of a data line for two time-multiplexed channels, a word select line, and 13 | a clock line. More information about the I2S bus specification can be 14 | found [here](https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdf). 15 | 16 | ## Microcontroller 17 | 18 | The board we will be using comes from the STM32 Nucleo-64 family. In 19 | particular, we will be using the STM32 Nucleo-64 development board with 20 | the [STM32F072RB microcontroller unit](https://www.st.com/en/evaluation-tools/nucleo-f072rb.html). You can find more information about this family of boards by reading the [official documentation](https://www.st.com/content/ccc/resource/technical/document/data_brief/c8/3c/30/f7/d6/08/4a/26/DM00105918.pdf/files/DM00105918.pdf/jcr:content/translations/en.DM00105918.pdf). 21 | 22 | ![](../.gitbook/assets/nucleo_board.jpg) 23 | 24 | _Figure: STM32 Nucleo development board._ [Picture source](https://www.st.com/en/evaluation-tools/nucleo-f072rb.html). 25 | 26 | ## Microphone 27 | 28 | The microphone part we will be using is the 29 | [I2S MEMS Microphone Breakout](https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/overview) by Adafruit. 30 | We describe the component in more detail in the 31 | [following chapter](../passthrough/audio-io/microphone.md), 32 | as we build a _passthrough_ \(passing the microphone input directly 33 | to the output\), which is the "hello world" equivalent for audio. 34 | 35 | ![](../.gitbook/assets/sensors_3421_quarter_orig.jpg) 36 | 37 | _Figure: Adafruit I2S MEMS Microphone Breakout._ [Picture source](http://learn.adafruit.com/assets/39631). 38 | 39 | ## DAC + Audio Jack 40 | 41 | The microphone we are using measures an _analog_ \(continuous in time and 42 | amplitude\) signal and returns a _digital_ \(discrete in time and amplitude\) 43 | signal, which can be further processed by our microcontroller. In order to 44 | playback or listen to this digital signal, it is necessary to convert it 45 | back to an analog signal; this can be done with a DAC \(Digital-to-Analog 46 | Converter\). We will be using Adafruit's [I2S Stereo Decoder Breakout](https://learn.adafruit.com/adafruit-i2s-stereo-decoder-uda1334a/overview), 47 | which contains the DAC, an audio jack for connecting headphones, and the 48 | necessary additional components. We will describe the DAC in more detail 49 | as we build a passthrough in the [following chapter](../passthrough/audio-io/dac.md). 50 | 51 | ![](../.gitbook/assets/adafruit_products_3678_top_orig.jpg) 52 | 53 | _Figure: Adafruit I2S Stereo Decoder - UDA1334A Breakout._ [Picture source](http://learn.adafruit.com/assets/48396). 54 | 55 | -------------------------------------------------------------------------------- /docs/installation/software/README.md: -------------------------------------------------------------------------------- 1 | # 1.2 Software 2 | 3 | In the following sections, we walkthrough the installation of the two software tools that will be essential in our workflow: 4 | 5 | * [**CubeMX**](https://www.st.com/en/development-tools/stm32cubemx.html): a graphical software configuration tool that simplifies the process of generating the C initialization code for STM32 microcontrollers. See [here](cubemx.md) for installation instructions. 6 | 7 | ![](../../.gitbook/assets/cubemx.png) 8 | 9 | _Figure: Screenshot of CubeMX._ 10 | 11 | 12 | * [**System Workbench for STM32 \(SW4STM32\)**](https://www.st.com/en/development-tools/sw4stm32.html): an Eclipse-based IDE for programming STM32 microcontrollers. See [here](sw4stm32.md) for installation instructions. 13 | 14 | ![](../../.gitbook/assets/sw4stm32.png) 15 | 16 | _Figure: Screenshot of SW4STM32._ 17 | 18 | -------------------------------------------------------------------------------- /docs/installation/software/eclipse_tips.md: -------------------------------------------------------------------------------- 1 | # Eclipse tips 2 | 3 | ## Shortcuts 4 | 5 | Below are some shortcuts we find particularly useful. For MacOs, replace `"Ctrl"` with `"Command"`. 6 | 7 | * `"Ctrl +"` click on function/variable for seeing its definition. 8 | * `"Ctrl + Space"` for getting function/variable auto-completion \(also `"Ctrl"` for MacOS since `"Command + Space"` opens the Spotlight application\). 9 | * `"Ctrl + B"` for building the _active_ project. 10 | * More shortcuts can be found [here](https://dzone.com/articles/effective-eclipse-shortcut-key). 11 | 12 | ## Debugging 13 | 14 | Below are some useful debugging tips: 15 | 16 | * At one point you might end up with the error presented below. 17 | 18 | ![](../../.gitbook/assets/errorstoppreviousconfig_enlarged.png) 19 | 20 | Don't worry you just have to stop the previously made "Debug session" as the driver cannot access twice the target board. \(Same error as if the board was disconnected or not well powered\). Press the "Stop" or the "Disconnect" button as shown below. 21 | 22 | ![](../../.gitbook/assets/stoppreviousconfig.png) 23 | 24 | * If you rename or copy/paste a project \(useful to make a backup of a working project!\) you might need to edit the debug configuration manually. Indeed, the debug config will still have the old binary file's name and thus will use it to program the board. The easiest workaround is to manually delete the binary file and make a new session that will automatically have the new binary file. First, you will need to open the "Debug Configuration" window as shown below. 25 | 26 | ![](../../.gitbook/assets/debug_config_menu.png) 27 | 28 | And then you can proceed to deleting the old file and creating a new session. 29 | 30 | ![](../../.gitbook/assets/debug_config_old_name.png) 31 | 32 | Consequently, building the project after renaming the project and performing these steps will result in an ELF file with the new project! 33 | 34 | * You can double-click just to the left of a line number to create a breakpoint at a particular line. When running the program in "Debug" mode, the execution will stop at this line and you can resume using one of the buttons on the toolbar. 35 | 36 | ![](../../.gitbook/assets/24_resume.png) 37 | 38 | * If you right-click a variable, you can select to "Add watch expression", which will let you monitor and edit the value of a certain variable. Just note that they will be visible only when the microcontroller is stopped on a breakpoint or with the pause button. 39 | 40 | ![](../../.gitbook/assets/whatchexpression.png) 41 | 42 | Some shortcuts for debugging with breakpoints: 43 | 44 | * `F5` - "Step into" 45 | * `F6` - "Step over" 46 | * `F7` - "Step return" 47 | * `F8` - "Resume" 48 | * `"Ctrl+Shift+B"` - "Toggle breakpoint" 49 | 50 | -------------------------------------------------------------------------------- /docs/intro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/intro.jpg -------------------------------------------------------------------------------- /docs/linear-prediction/README.md: -------------------------------------------------------------------------------- 1 | # 6. LINEAR PREDICTION 2 | 3 | In this exercise, we enhance our granular synthesis pitch shifter by using 4 | [Linear Predictive Coding](https://en.wikipedia.org/wiki/Linear_predictive_coding) (LPC). 5 | Although our real-time implementation already does a good job in lowering the pitch, 6 | the result may sound *unnatural*. The motivation behind using LPC is to preserve the energy envelope of the initial speech 7 | **throughout the transformation** in order to improve the output quality. 8 | 9 | 10 | In [Section 6.1](theory.md), we briefly explain the theory behind LPC. 11 | In particular, we will see that there exists an intuitive model to describe the production of human speech. 12 | This model results in a system of linear equations that needs to be solved (for each buffer) in order to keep this energy envelope untouched. 13 | 14 | 15 | In [Section 6.2](implementation.md), we implement the code that solves the set of equations presented in Section 6.1. 16 | We then guide you on the use of this code in order to improve the quality of the granular synthesis effect from the previous chapter. 17 | 18 | As before, text contained in highlighted boxes, as shown below, will require 19 | ***you*** to determine the appropriate solution/implementation. 20 | 21 | {% hint style="info" %} 22 | TASK: This is a task for you! 23 | {% endhint %} 24 | 25 | -------------------------------------------------------------------------------- /docs/linear-prediction/figs/energy_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/linear-prediction/figs/energy_comparison.png -------------------------------------------------------------------------------- /docs/linear-prediction/figs/energy_gs_lpc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/linear-prediction/figs/energy_gs_lpc.png -------------------------------------------------------------------------------- /docs/linear-prediction/figs/energy_problem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/linear-prediction/figs/energy_problem.png -------------------------------------------------------------------------------- /docs/linear-prediction/figs/equation_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/linear-prediction/figs/equation_system.png -------------------------------------------------------------------------------- /docs/linear-prediction/figs/lpc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/linear-prediction/figs/lpc.jpg -------------------------------------------------------------------------------- /docs/linear-prediction/lec13.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/docs/linear-prediction/lec13.pdf -------------------------------------------------------------------------------- /docs/passthrough/README.md: -------------------------------------------------------------------------------- 1 | # 2. AUDIO PASSTHROUGH 2 | 3 | A "passthrough" can be viewed as the audio equivalent of "hello world". In this chapter, 4 | we will build a passthrough with the hardware and software components previously 5 | introduced. Moreover, we will point out some key specifications from the microphone 6 | and the DAC \(Digital-to-Analog Converter\) components so that our STM32 board can 7 | successfully interface with them. This will be done in [Section 2.1](audio-io/). 8 | 9 | Using the CubeMX software, we will update the configuration of the microcontroller in 10 | [Section 2.2](updating_stm32_peripherals.md). We will guide you through the wiring in 11 | [Section 2.3](wiring.md). Finally, we will program our passthrough in 12 | [Section 2.4](coding.md) using the SW4STM32 software. 13 | 14 | Highlighted boxes, as shown below, specify a task for _**you**_ to determine the 15 | appropriate solution and implementation. 16 | 17 | {% hint style="info" %} 18 | TASK: This is a task for you! 19 | {% endhint %} 20 | 21 | A passthrough is a great _sanity check_ when first beginning with an audio DSP system. 22 | Moreover, it serves as a useful starting point for new projects as we will see in the 23 | following chapters when we develop more complicated programs! 24 | 25 | ![](../.gitbook/assets/final_wiring.jpg) 26 | 27 | _Figure: Final wiring._ 28 | 29 | -------------------------------------------------------------------------------- /docs/passthrough/audio-io/README.md: -------------------------------------------------------------------------------- 1 | # 2.1 Audio I/O theory 2 | 3 | The microphone and DAC components we will be using rely on the I2S \(Inter-IC Sound\) bus specification for audio transfer. This is a 3-line serial bus consisting of: 4 | 5 | 1. A **data** line for two time-multiplexed channels \(usually denoted as _left_ and _right_\). 6 | 2. A **word select** line for indicating which of the two channels is being transmitted/received. 7 | 3. A **clock** line for which each period will correspond to a unique bit of data. 8 | 9 | More information about the I2S bus specification can be read [here](https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdf). 10 | 11 | We first discuss the I2S protocol with respect to the [microphone](microphone.md) and then for the [DAC](dac.md). We recommend reading in this order as the microphone section is easier to grasp and will introduce common terminology used later on. 12 | 13 | For the STM board that we are using, we will configure two I2S buses: one for input and the other for output. This configuration process will be covered in [Chapter 2.2](../updating_stm32_peripherals.md). 14 | 15 | -------------------------------------------------------------------------------- /scripts/_templates/rt_simulated.py: -------------------------------------------------------------------------------- 1 | """ 2 | This template script will just perform a passthrough, namely the output WAV 3 | file will be unprocessed. 4 | 5 | Run with the following command: 6 | 7 | python rt_simulated.py 8 | """ 9 | 10 | from scipy.io import wavfile 11 | import numpy as np 12 | 13 | # define necessary utility functions 14 | 15 | # parameters 16 | buffer_len = 256 17 | 18 | # test signal 19 | input_wav = "speech.wav" 20 | samp_freq, signal = wavfile.read(input_wav) 21 | signal = signal[:,] # get first channel 22 | n_buffers = len(signal)//buffer_len 23 | data_type = signal.dtype 24 | 25 | print("Sampling frequency : %d Hz" % samp_freq) 26 | print("Data type : %s" % signal.dtype) 27 | 28 | # allocate input and output buffers 29 | input_buffer = np.zeros(buffer_len, dtype=data_type) 30 | output_buffer = np.zeros(buffer_len, dtype=data_type) 31 | 32 | # state variables 33 | def init(): 34 | 35 | # declare variables used in `process` 36 | # global 37 | 38 | # define variables, lookup tables 39 | 40 | return 41 | 42 | 43 | # the process function! 44 | def process(input_buffer, output_buffer, buffer_len): 45 | 46 | # specify global variables modified here 47 | # global 48 | 49 | # process one sample at a time 50 | for n in range(buffer_len): 51 | 52 | # passthrough 53 | output_buffer[n] = input_buffer[n] 54 | 55 | """ 56 | Nothing to touch after this! 57 | """ 58 | init() 59 | # simulate block based processing 60 | signal_proc = np.zeros(n_buffers*buffer_len, dtype=data_type) 61 | for k in range(n_buffers): 62 | 63 | # index the appropriate samples 64 | input_buffer = signal[k*buffer_len:(k+1)*buffer_len] 65 | process(input_buffer, output_buffer, buffer_len) 66 | signal_proc[k*buffer_len:(k+1)*buffer_len] = output_buffer 67 | 68 | # write to WAV 69 | wavfile.write("speech_mod.wav", samp_freq, signal_proc) 70 | -------------------------------------------------------------------------------- /scripts/_templates/rt_sounddevice.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import sounddevice as sd 3 | 4 | # define necessary utility functions 5 | 6 | # parameters 7 | buffer_len = 256 8 | data_type = np.int16 9 | samp_freq = 16000 10 | 11 | print("Sampling frequency : %d Hz" % samp_freq) 12 | print("Data type : %s" % data_type) 13 | 14 | # allocate input and output buffers 15 | input_buffer = np.zeros(buffer_len, dtype=data_type) 16 | output_buffer = np.zeros(buffer_len, dtype=data_type) 17 | 18 | # state variables 19 | def init(): 20 | 21 | # declare variables used in `process` 22 | # global 23 | 24 | # define variables, lookup tables 25 | 26 | return 27 | 28 | 29 | # the process function! 30 | def process(input_buffer, output_buffer, buffer_len): 31 | 32 | # specify global variables modified here 33 | # global 34 | 35 | # process one sample at a time 36 | for n in range(buffer_len): 37 | 38 | # passthrough 39 | output_buffer[n] = input_buffer[n] 40 | 41 | """ 42 | Nothing to touch after this! 43 | """ 44 | try: 45 | sd.default.samplerate = samp_freq 46 | sd.default.blocksize = buffer_len 47 | sd.default.dtype = data_type 48 | 49 | def callback(indata, outdata, frames, time, status): 50 | if status: 51 | print(status) 52 | process(indata[:, 0], outdata[:, 0], frames) 53 | 54 | init() 55 | with sd.Stream(channels=1, callback=callback): 56 | print('#' * 80) 57 | print('press Return to quit') 58 | print('#' * 80) 59 | input() 60 | except KeyboardInterrupt: 61 | print('\nInterrupted by user') 62 | -------------------------------------------------------------------------------- /scripts/_templates/speech.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/scripts/_templates/speech.wav -------------------------------------------------------------------------------- /scripts/alien_voice/alien_voice_effect_200Hz.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/scripts/alien_voice/alien_voice_effect_200Hz.wav -------------------------------------------------------------------------------- /scripts/alien_voice/alien_voice_effect_incomplete.py: -------------------------------------------------------------------------------- 1 | """ 2 | Incomplete alien voice effect. This file will simply perform passthrough. 3 | 4 | You need to complete the process function. 5 | """ 6 | 7 | from scipy.io import wavfile 8 | import os 9 | import numpy as np 10 | from utils import build_sine_table 11 | 12 | 13 | # parameters 14 | buffer_len = 256 15 | f_sine = 200 # Hz, for modulation 16 | high_pass_on = False 17 | 18 | # test signal 19 | input_wav = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 20 | samp_freq, signal = wavfile.read(input_wav) 21 | if len(signal.shape) > 1: 22 | signal = signal[:, ] # get first channel 23 | n_buffers = len(signal)//buffer_len 24 | data_type = signal.dtype 25 | 26 | print("Sampling frequency : %d Hz" % samp_freq) 27 | print("Data type : %s" % signal.dtype) 28 | 29 | # allocate input and output buffers 30 | input_buffer = np.zeros(buffer_len, dtype=data_type) 31 | output_buffer = np.zeros(buffer_len, dtype=data_type) 32 | 33 | # state variables 34 | def init(): 35 | global sine_pointer 36 | global x_prev 37 | global GAIN 38 | global SINE_TABLE 39 | global MAX_SINE 40 | global LOOKUP_SIZE 41 | 42 | GAIN = 1 43 | x_prev = 0 44 | sine_pointer = 0 45 | 46 | # compute SINE TABLE 47 | vals = build_sine_table(f_sine, samp_freq, data_type=data_type) 48 | SINE_TABLE = vals[0] 49 | MAX_SINE = vals[1] 50 | LOOKUP_SIZE = vals[2] 51 | 52 | 53 | # the process function! 54 | def process(input_buffer, output_buffer, buffer_len): 55 | 56 | global x_prev 57 | global sine_pointer 58 | 59 | for n in range(buffer_len): 60 | 61 | # high pass filter 62 | if high_pass_on: 63 | output_buffer[n] = input_buffer[n] - x_prev 64 | else: 65 | output_buffer[n] = input_buffer[n] 66 | 67 | # TODO: perform modulation for effect 68 | output_buffer[n] 69 | 70 | # TODO: update state variables 71 | sine_pointer 72 | x_prev 73 | 74 | 75 | """ 76 | Nothing to touch after this! 77 | """ 78 | init() 79 | # simulate block based processing 80 | signal_proc = np.zeros(n_buffers*buffer_len, dtype=data_type) 81 | for k in range(n_buffers): 82 | 83 | # index the appropriate samples 84 | input_buffer = signal[k*buffer_len:(k+1)*buffer_len] 85 | process(input_buffer, output_buffer, buffer_len) 86 | signal_proc[k*buffer_len:(k+1)*buffer_len] = output_buffer 87 | 88 | # write to WAV 89 | wavfile.write("alien_voice_effect.wav", samp_freq, signal_proc) 90 | -------------------------------------------------------------------------------- /scripts/alien_voice/alien_voice_sounddevice_incomplete.py: -------------------------------------------------------------------------------- 1 | """ 2 | Incomplete alien voice effect with sounddevice library. 3 | 4 | Without any modification, this file will simply perform a passthrough with your laptop's soundcard. 5 | 6 | You need to complete the process function. 7 | """ 8 | 9 | import sounddevice as sd 10 | import numpy as np 11 | from utils import build_sine_table 12 | 13 | 14 | # parameters 15 | buffer_len = 256 16 | f_sine = 200 # Hz, for modulation 17 | high_pass_on = False 18 | 19 | data_type = np.int16 20 | samp_freq = 16000 21 | 22 | print("Sampling frequency : %d Hz" % samp_freq) 23 | print("Data type : %s" % data_type) 24 | 25 | # allocate input and output buffers 26 | input_buffer = np.zeros(buffer_len, dtype=data_type) 27 | output_buffer = np.zeros(buffer_len, dtype=data_type) 28 | 29 | # state variables 30 | def init(): 31 | global sine_pointer 32 | global x_prev 33 | global GAIN 34 | global SINE_TABLE 35 | global MAX_SINE 36 | global LOOKUP_SIZE 37 | 38 | GAIN = 1 39 | x_prev = 0 40 | sine_pointer = 0 41 | 42 | # compute SINE TABLE 43 | vals = build_sine_table(f_sine, samp_freq, data_type=data_type) 44 | SINE_TABLE = vals[0] 45 | MAX_SINE = vals[1] 46 | LOOKUP_SIZE = vals[2] 47 | 48 | 49 | # the process function! 50 | def process(input_buffer, output_buffer, buffer_len): 51 | 52 | global x_prev 53 | global sine_pointer 54 | 55 | for n in range(buffer_len): 56 | 57 | # high pass filter 58 | if high_pass_on: 59 | output_buffer[n] = input_buffer[n] - x_prev 60 | else: 61 | output_buffer[n] = input_buffer[n] 62 | 63 | # TODO: perform modulation for effect 64 | output_buffer[n] 65 | 66 | # TODO: update state variables 67 | sine_pointer 68 | x_prev 69 | 70 | 71 | """ 72 | Nothing to touch after this! 73 | """ 74 | try: 75 | sd.default.samplerate = samp_freq 76 | sd.default.blocksize = buffer_len 77 | sd.default.dtype = data_type 78 | 79 | def callback(indata, outdata, frames, time, status): 80 | if status: 81 | print(status) 82 | process(indata[:, 0], outdata[:, 0], frames) 83 | 84 | init() 85 | with sd.Stream(channels=1, callback=callback): 86 | print('#' * 80) 87 | print('press Return to quit') 88 | print('#' * 80) 89 | input() 90 | except KeyboardInterrupt: 91 | print('\nInterrupted by user') 92 | -------------------------------------------------------------------------------- /scripts/alien_voice/compute_sinusoid_lookup.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | 5 | """ 6 | Compute lookup table 7 | """ 8 | data_type = 16 # 16 or 32 signed integer 9 | samp_freq = 32000 10 | f_sine = 400 11 | 12 | # periods 13 | samp_per = 1./samp_freq 14 | sine_per = 1./f_sine 15 | 16 | # compute time instances 17 | t_vals = np.arange(0, sine_per*1, samp_per) 18 | LOOKUP_SIZE = len(t_vals) 19 | n_vals = np.arange(LOOKUP_SIZE) 20 | 21 | # compute the sine table 22 | MAX_SINE = 2**(data_type-1)-1 # [-(2*data_type-1), 2**(data_type-1)] 23 | w_mod = 2*np.pi*(f_sine/samp_freq) 24 | sine_table = np.sin(w_mod*n_vals) * MAX_SINE 25 | if data_type == 16: 26 | sine_table = sine_table.astype(np.int16) 27 | print_type = np.uint16 28 | print_format = '0x%04x' 29 | elif data_type == 32: 30 | sine_table = sine_table.astype(np.int32) 31 | print_type = np.uint32 32 | print_format = '0x%08x' 33 | else: 34 | raise ValueError("Invalid data type!") 35 | 36 | """ 37 | Print C code. 38 | """ 39 | print('#define SINE_TABLE_SIZE', str(LOOKUP_SIZE)) 40 | print('#define SIN_MAX', (print_format % MAX_SINE)) 41 | if data_type == 16: 42 | print('const int16_t sine_table[SINE_TABLE_SIZE] = {') 43 | elif data_type == 32: 44 | print('const int32_t sine_table[SINE_TABLE_SIZE] = {') 45 | print(','.join([print_format % i.astype(print_type) for i in sine_table])) 46 | print('};') 47 | 48 | """ 49 | Visualize 50 | """ 51 | plt.figure() 52 | plt.stem(n_vals, sine_table) 53 | plt.grid() 54 | plt.autoscale(enable=True, axis='x', tight=True) 55 | plt.xlabel("Index") 56 | plt.title("Sine table for %d Hz at %d Hz sampling rate" % (f_sine, samp_freq)) 57 | plt.show() 58 | -------------------------------------------------------------------------------- /scripts/alien_voice/discontinuous_block_sines.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | 5 | """ 6 | Compute lookup table 7 | """ 8 | # user parameters 9 | samp_freq = 32000 10 | f_sine = 400 11 | n_frames = 128 # buffer length 12 | n_periods = 1 # of sine table for better resolution (more samples) 13 | 14 | # periods 15 | samp_per = 1./samp_freq 16 | sine_per = 1./f_sine 17 | 18 | # compute time instances 19 | t_vals = np.arange(0, sine_per*n_periods, samp_per) 20 | LOOKUP_SIZE = len(t_vals) 21 | n_vals = np.arange(LOOKUP_SIZE) 22 | 23 | # compute the sine table 24 | data_type = 16 # 16 or 32 signed integer 25 | MAX_SINE = 2**(data_type-1)-1 # [-(2*data_type-1), 2**(data_type-1)] 26 | w_mod = 2*np.pi*(f_sine/samp_freq) 27 | sine_table = np.sin(w_mod*n_vals) * MAX_SINE 28 | if data_type == 16: 29 | sine_table = sine_table.astype(np.int16) 30 | elif data_type == 32: 31 | sine_table = sine_table.astype(np.int32) 32 | else: 33 | raise ValueError("Invalid data type!") 34 | 35 | 36 | """ 37 | Visualize consecutive buffer processing but not stitching properly 38 | """ 39 | 40 | n_buffers = 2 41 | 42 | # no state variable 43 | sine_vals_disc = [] 44 | for k in range(n_buffers): 45 | for n in range(n_frames): 46 | sine_vals_disc.append(sine_table[n%LOOKUP_SIZE]) 47 | 48 | # # using state variable for number of processed blocks 49 | # sine_vals = [] 50 | # B = 0 51 | # for k in range(n_buffers): 52 | # for n in range(n_frames): 53 | # sine_vals.append(sine_table[(n_frames*B+n)%LOOKUP_SIZE]) 54 | # B += 1 55 | 56 | # using state variable for sine pointer 57 | sine_vals = [] 58 | sine_pointer = 0 59 | for k in range(n_buffers): 60 | for n in range(n_frames): 61 | sine_vals.append(sine_table[sine_pointer]) 62 | sine_pointer += 1 63 | sine_pointer %= LOOKUP_SIZE 64 | 65 | plt.figure() 66 | plt.title("Buffer length of %d; modulating with %d Hz" % (n_frames, f_sine)) 67 | plt.scatter(range(len(sine_vals_disc)), sine_vals_disc, marker='^', label="sampled sine (discontinuous)") 68 | plt.scatter(range(len(sine_vals)), sine_vals, marker='v', c='g', label="sampled sine (state var)") 69 | plt.grid() 70 | plt.axvline(x=n_frames, c='r', ls='--', label="buffer boundary") 71 | plt.autoscale(enable=True, axis='x', tight=True) 72 | plt.xlabel("Time index") 73 | plt.xlim([60, 170]) 74 | plt.legend(loc=3) 75 | 76 | plt.savefig('discontinuous_sine.png', format='png', dpi=300) 77 | 78 | plt.show() 79 | -------------------------------------------------------------------------------- /scripts/alien_voice/plot_zplane.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2011 Christopher Felton 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU Lesser General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU Lesser General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU Lesser General Public License 15 | # along with this program. If not, see . 16 | # 17 | 18 | # The following is derived from the slides presented by 19 | # Alexander Kain for CS506/606 "Special Topics: Speech Signal Processing" 20 | # CSLU / OHSU, Spring Term 2011. 21 | 22 | import numpy as np 23 | import matplotlib.pyplot as plt 24 | from matplotlib import patches 25 | from matplotlib.figure import Figure 26 | from matplotlib import rcParams 27 | 28 | def zplane(b,a): 29 | """Plot the complex z-plane given a transfer function. 30 | """ 31 | 32 | # get a figure/plot 33 | ax = plt.subplot(111) 34 | 35 | # create the unit circle 36 | uc = patches.Circle((0,0), radius=1, fill=False, 37 | color='black', ls='dashed') 38 | ax.add_patch(uc) 39 | 40 | # The coefficients are less than 1, normalize the coeficients 41 | if np.max(b) > 1: 42 | kn = np.max(b) 43 | b = b/float(kn) 44 | else: 45 | kn = 1 46 | 47 | if np.max(a) > 1: 48 | kd = np.max(a) 49 | a = a/float(kd) 50 | else: 51 | kd = 1 52 | 53 | # Get the poles and zeros 54 | p = np.roots(a) 55 | z = np.roots(b) 56 | k = kn/float(kd) 57 | 58 | # Plot the zeros and set marker properties 59 | t1 = plt.plot(z.real, z.imag, 'go', ms=10, label="Zeros") 60 | plt.setp( t1, markersize=10.0, markeredgewidth=1.0, 61 | markeredgecolor='k', markerfacecolor='g') 62 | 63 | # Plot the poles and set marker properties 64 | t2 = plt.plot(p.real, p.imag, 'rx', ms=10, label="Poles") 65 | plt.setp( t2, markersize=12.0, markeredgewidth=3.0, 66 | markeredgecolor='r', markerfacecolor='r') 67 | 68 | ax.spines['left'].set_position('center') 69 | ax.spines['bottom'].set_position('center') 70 | ax.spines['right'].set_visible(False) 71 | ax.spines['top'].set_visible(False) 72 | 73 | # set the ticks 74 | r = 1.5; plt.axis('scaled'); plt.axis([-r, r, -r, r]) 75 | ticks = [-1, -.5, .5, 1]; plt.xticks(ticks); plt.yticks(ticks) 76 | 77 | plt.legend() 78 | 79 | 80 | return z, p, k -------------------------------------------------------------------------------- /scripts/alien_voice/simple_high_pass.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | from scipy.signal import freqz 4 | from scipy.stats import linregress 5 | import sys 6 | from mpl_toolkits.axes_grid.inset_locator import inset_axes 7 | 8 | from plot_zplane import zplane 9 | 10 | save = True 11 | 12 | """ 13 | H(z) = (b0 + b1*z^-1 + ... + bN*z^-N) / (a0 + a1*z^-1 + ... + aN*z^-N) 14 | """ 15 | b = np.array([1, -1]) 16 | a = np.array([1]) 17 | fs = 32000 18 | 19 | # zeros/poles plot 20 | zplane(b, a) 21 | plt.title("Zeros/poles plot") 22 | 23 | if save: 24 | plt.savefig('zplot_high_pass.png', format='png', dpi=1000) 25 | 26 | # frequency response 27 | w, h = freqz(b) 28 | 29 | h = h[1:] 30 | w = w[1:] 31 | 32 | h_db = 20 * np.log10(abs(h)) 33 | angles = np.unwrap(np.angle(h)) 34 | freq = w / (2*np.pi) *fs 35 | 36 | fig = plt.figure() 37 | plt.title('Frequency response') 38 | ax1 = fig.add_subplot(111) 39 | plt.plot(freq, h_db, 'b') 40 | plt.ylabel('Magnitude [dB]', color='b') 41 | plt.xlabel('Frequency [Hz]') 42 | ax2 = ax1.twinx() 43 | plt.plot(freq, angles, 'g') 44 | plt.ylabel('Phase (radians)', color='g') 45 | plt.grid() 46 | plt.axis('tight') 47 | 48 | if save: 49 | plt.savefig('freq_resp_high_pass.png', format='png', dpi=1000) 50 | 51 | fig = plt.figure() 52 | plt.title('Frequency response (log scale)') 53 | ax1 = fig.add_subplot(111) 54 | plt.semilogx(freq, h_db, 'b') 55 | plt.ylabel('Magnitude [dB]', color='b') 56 | plt.xlabel('Frequency [Hz]') 57 | ax2 = ax1.twinx() 58 | plt.semilogx(freq, angles, 'g') 59 | plt.ylabel('Phase (radians)', color='g') 60 | plt.grid() 61 | plt.axis('tight') 62 | 63 | if save: 64 | plt.savefig('freq_resp_high_pass_log.png', format='png', dpi=1000) 65 | 66 | # calculate filter roll-off 67 | slope = linregress(np.log10(freq), h_db)[0] 68 | print("Filter roll-off : %0.2f dB/decade" % slope) 69 | slope = linregress(np.log2(freq), h_db)[0] 70 | print("Filter roll-off : %0.2f dB/octave" % slope) 71 | 72 | plt.show() 73 | -------------------------------------------------------------------------------- /scripts/alien_voice/utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def build_sine_table(f_sine, samp_freq, data_type): 5 | """ 6 | :param f_sine: Modulate frequency for voice effect in Hz. 7 | :param samp_freq: Sampling frequency in Hz 8 | :param data_type: Data type of sinusoid table. Must be signed integer type. 9 | :return: 10 | """ 11 | 12 | if data_type is np.int16 or np.int32: 13 | MAX_SINE = np.iinfo(data_type).max 14 | else: 15 | raise ValueError("Data type must be signed integer.") 16 | 17 | # periods 18 | samp_per = 1./samp_freq 19 | sine_per = 1./f_sine 20 | 21 | # compute time instances 22 | t_vals = np.arange(0, sine_per, samp_per) 23 | LOOKUP_SIZE = len(t_vals) 24 | n_vals = np.arange(LOOKUP_SIZE) 25 | 26 | # compute the sine table 27 | w_mod = 2*np.pi*f_sine/samp_freq 28 | SINE_TABLE = np.sin(w_mod*n_vals) * MAX_SINE 29 | 30 | return SINE_TABLE, MAX_SINE, LOOKUP_SIZE 31 | -------------------------------------------------------------------------------- /scripts/dft/clarinet_D4.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/scripts/dft/clarinet_D4.wav -------------------------------------------------------------------------------- /scripts/dft/clarinet_D5.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/scripts/dft/clarinet_D5.wav -------------------------------------------------------------------------------- /scripts/dft/dft_pitch_shift_incomplete.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy.io import wavfile 3 | import os 4 | from utils_dft_sol import dft_rescale, build_dft_rescale_lookup, ms2smp, compute_stride, win_taper 5 | 6 | """ 7 | DFT pitch shifting. 8 | """ 9 | 10 | """ User selected parameters """ 11 | input_wav = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 12 | grain_len = 40 # in milliseconds 13 | grain_over = 0.4 # grain overlap (0,1) 14 | shift_factor = 1.5 15 | 16 | # open WAV file 17 | samp_freq, signal = wavfile.read(input_wav) 18 | if len(signal.shape)>1 : 19 | signal = signal[:,0] # get first channel 20 | data_type = signal.dtype 21 | MAX_VAL = np.iinfo(data_type).max 22 | 23 | # derived parameters 24 | GRAIN_LEN_SAMP = ms2smp(grain_len, samp_freq) 25 | STRIDE = compute_stride(GRAIN_LEN_SAMP, grain_over) 26 | OVERLAP_LEN = GRAIN_LEN_SAMP-STRIDE 27 | 28 | is_even = (GRAIN_LEN_SAMP % 2 == 0) 29 | if is_even: 30 | N_BINS = GRAIN_LEN_SAMP // 2 + 1 31 | else: 32 | N_BINS = (GRAIN_LEN_SAMP + 1) // 2 33 | 34 | # allocate input and output buffers 35 | input_buffer = np.zeros(STRIDE, dtype=data_type) 36 | output_buffer = np.zeros(STRIDE, dtype=data_type) 37 | 38 | # state variables and constants 39 | def init(): 40 | 41 | # lookup table for tapering window 42 | global WIN 43 | WIN = win_taper(GRAIN_LEN_SAMP, grain_over, data_type) 44 | 45 | # lookup table for DFT rescaling 46 | global SHIFT_IDX, MAX_BIN, input_concat_float 47 | SHIFT_IDX, MAX_BIN = build_dft_rescale_lookup(N_BINS, shift_factor) 48 | input_concat_float = np.zeros(GRAIN_LEN_SAMP, dtype=np.float32) 49 | 50 | # TODO: create arrays to pass between buffers (state variables) 51 | # copy from granular synthesis 52 | global ... 53 | 54 | # TODO: create arrays for intermediate values 55 | # copy from granular synthesis 56 | global ... 57 | 58 | 59 | # the process function! 60 | def process(input_buffer, output_buffer, buffer_len): 61 | 62 | global input_concat_float 63 | # TODO: need to specify those global variables changing in this function (state variables and intermediate values) 64 | # copy from granular synthesis 65 | global ... 66 | 67 | """ 68 | Apply effect 69 | """ 70 | # TODO: append samples from previous buffer 71 | # copy from granular synthesis 72 | for n in range(GRAIN_LEN_SAMP): 73 | ... 74 | 75 | # TODO: rescale 76 | for n in range(GRAIN_LEN_SAMP): 77 | grain[n] = input_concat[n] 78 | 79 | # TODO: apply window 80 | # copy from granular synthesis 81 | for n in range(GRAIN_LEN_SAMP): 82 | ... 83 | 84 | # TODO: write to output and update state variables 85 | # copy from granular synthesis 86 | for n in range(GRAIN_LEN_SAMP): 87 | # overlapping part 88 | if n < OVERLAP_LEN: 89 | ... 90 | # non-overlapping part 91 | elif n < STRIDE: 92 | ... 93 | # update state variables 94 | else: 95 | ... 96 | 97 | 98 | """ 99 | Nothing to touch after this! 100 | """ 101 | init() 102 | # simulate block based processing 103 | n_buffers = len(signal)//STRIDE 104 | signal_proc = np.zeros(n_buffers*STRIDE, dtype=data_type) 105 | for k in range(n_buffers): 106 | 107 | # sample indices 108 | start_idx = k*STRIDE 109 | end_idx = (k+1)*STRIDE 110 | 111 | # index the appropriate samples 112 | input_buffer = signal[start_idx:end_idx] 113 | process(input_buffer, output_buffer, STRIDE) 114 | signal_proc[start_idx:end_idx] = output_buffer 115 | 116 | # write to WAV 117 | file_name = "output_dft_pitch_shift.wav" 118 | print("Result written to: %s" % file_name) 119 | wavfile.write(file_name, samp_freq, signal_proc) 120 | 121 | -------------------------------------------------------------------------------- /scripts/dft/dft_pitch_shift_sounddevice.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | import sounddevice as sd 4 | from utils_dft_sol import dft_rescale, build_dft_rescale_lookup, ms2smp, compute_stride, win_taper 5 | 6 | """ 7 | DFT pitch shifting 8 | """ 9 | 10 | """ User selected parameters """ 11 | input_wav = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 12 | grain_len = 40 # in milliseconds 13 | grain_over = 0.4 # grain overlap (0,1) 14 | shift_factor = 1.5 15 | data_type = np.int16 16 | samp_freq = 16000 17 | 18 | # derived parameters 19 | MAX_VAL = np.iinfo(data_type).max 20 | GRAIN_LEN_SAMP = ms2smp(grain_len, samp_freq) 21 | STRIDE = compute_stride(GRAIN_LEN_SAMP, grain_over) 22 | OVERLAP_LEN = GRAIN_LEN_SAMP-STRIDE 23 | 24 | is_even = (GRAIN_LEN_SAMP % 2 == 0) 25 | if is_even: 26 | N_BINS = GRAIN_LEN_SAMP // 2 + 1 27 | else: 28 | N_BINS = (GRAIN_LEN_SAMP + 1) // 2 29 | 30 | # allocate input and output buffers 31 | input_buffer = np.zeros(STRIDE, dtype=data_type) 32 | output_buffer = np.zeros(STRIDE, dtype=data_type) 33 | 34 | # state variables and constants 35 | def init(): 36 | ... 37 | 38 | 39 | 40 | # the process function! 41 | def process(input_buffer, output_buffer, buffer_len): 42 | 43 | ... 44 | 45 | 46 | """ 47 | # Nothing to touch after this! 48 | # """ 49 | try: 50 | sd.default.samplerate = samp_freq 51 | sd.default.blocksize = STRIDE 52 | sd.default.dtype = data_type 53 | 54 | def callback(indata, outdata, frames, time, status): 55 | if status: 56 | print(status) 57 | process(indata[:,0], outdata[:,0], frames) 58 | 59 | init() 60 | with sd.Stream(channels=1, callback=callback): 61 | print('#' * 80) 62 | print('press Return to quit') 63 | print('#' * 80) 64 | input() 65 | except KeyboardInterrupt: 66 | print('\nInterrupted by user') 67 | 68 | -------------------------------------------------------------------------------- /scripts/dft/dft_shift_example.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy.io import wavfile 3 | import os 4 | import matplotlib.pyplot as plt 5 | 6 | 7 | MAX_FREQ = 4000 8 | 9 | def plot_spec(x, Fs, max_freq=None, do_fft=True, label=None): 10 | if max_freq is None: 11 | max_freq = Fs/2 12 | C = int(len(x) * max_freq / Fs) 13 | X = np.abs(np.fft.fft(x)[0:C]) if do_fft else x[0:C] 14 | N = Fs * np.arange(0, C) / len(x); 15 | plt.plot(N, X, label=label) 16 | plt.xlim([0, max_freq]) 17 | plt.xlabel("Frequency [Hz]") 18 | ax = plt.gca() 19 | ax.axes.yaxis.set_ticklabels([]) 20 | return N, X 21 | 22 | 23 | def DFT_rescale(x, f): 24 | X = np.fft.fft(x) 25 | # separate even and odd lengths 26 | parity = (len(X) % 2 == 0) 27 | N = len(X) // 2 + 1 if parity else (len(X) + 1) // 2 28 | Y = np.zeros(N, dtype=np.complex) 29 | # work only in the first half of the DFT vector since input is real 30 | for n in range(N): 31 | # accumulate original frequency bins into rescaled bins 32 | ix = int(n * f) 33 | if ix < N: 34 | Y[ix] += X[n] 35 | # now rebuild a Hermitian-symmetric DFT 36 | Y = np.r_[Y, np.conj(Y[-2:0:-1])] if parity else np.r_[Y, np.conj(Y[-1:0:-1])] 37 | return np.real(np.fft.ifft(Y)) 38 | 39 | 40 | current_dir = os.path.dirname(os.path.realpath(__file__)) 41 | input_wav = os.path.join(current_dir, "clarinet_D4.wav") 42 | samp_freq, audio = wavfile.read(input_wav) 43 | 44 | # dft shift 45 | audio_shift = DFT_rescale(audio, 2) 46 | wavfile.write("clarinet_D5.wav", samp_freq, audio_shift) 47 | 48 | # plot 49 | plot_spec(audio, samp_freq, max_freq=MAX_FREQ, label="D4") 50 | plot_spec(audio_shift, samp_freq, max_freq=MAX_FREQ, label="D5") 51 | 52 | plt.legend() 53 | 54 | plt.show() -------------------------------------------------------------------------------- /scripts/dft/plot_clarinet_spectrum.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy.io import wavfile 3 | import os 4 | import matplotlib.pyplot as plt 5 | 6 | 7 | MAX_FREQ = 4000 8 | 9 | def plot_spec(x, Fs, max_freq=None, do_fft=True, label=None): 10 | if max_freq is None: 11 | max_freq = Fs/2 12 | C = int(len(x) * max_freq / Fs) 13 | X = np.abs(np.fft.fft(x)[0:C]) if do_fft else x[0:C] 14 | N = Fs * np.arange(0, C) / len(x); 15 | plt.plot(N, X, label=label) 16 | plt.xlim([0, max_freq]) 17 | plt.xlabel("Frequency [Hz]") 18 | ax = plt.gca() 19 | ax.axes.yaxis.set_ticklabels([]) 20 | return N, X 21 | 22 | 23 | current_dir = os.path.dirname(os.path.realpath(__file__)) 24 | input_wav = os.path.join(current_dir, "clarinet_D4.wav") 25 | samp_freq, audio = wavfile.read(input_wav) 26 | plot_spec(audio, samp_freq, max_freq=MAX_FREQ) 27 | 28 | plt.show() -------------------------------------------------------------------------------- /scripts/dft/utils_dft.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def build_dft_rescale_lookup(n_bins, shift_factor): 5 | """ 6 | Build lookup table from DFT bins to rescaled bins. 7 | 8 | :param n_bins: Number of bins in positive half of DFT. 9 | :param shift_factor: Shift factor for voice effect. 10 | :return shift_idx: Mapping from bin to rescaled bin. 11 | :return max_bin: Maximum bin until rescaled is less than `n_bins`. 12 | """ 13 | 14 | shift_idx = np.zeros(n_bins, dtype=np.int16) 15 | max_bin = n_bins 16 | for k in range(n_bins): 17 | """ 18 | TODO: 19 | - compute the mapping from a bin `k` to the rescaled bin `ix` 20 | - if: smaller than `n_bins` store in lookup table 21 | - else: update value of `max_bin` and break from loop 22 | """ 23 | shift_idx[k] = k 24 | 25 | return shift_idx, max_bin 26 | 27 | 28 | def dft_rescale(x, n_bins, shift_idx, max_bin): 29 | """ 30 | Rescale spectrum using the lookup table. 31 | 32 | :param x: Input segment in time domain 33 | :param n_bins: Number of bins in positive half of DFT. 34 | :param shift_idx: Mapping from bin to rescaled bin. 35 | :param max_bin: Maximum bin until rescaled is less than `n_bins`. 36 | :return: Pitch-shifted audio segment in time domain. 37 | """ 38 | 39 | X = np.fft.rfft(x) 40 | Y = np.zeros(n_bins, dtype=np.complex) 41 | 42 | for k in range(max_bin): 43 | # TODO: use lookup table to shift original bins. 44 | Y[k] += X[k] 45 | 46 | # take inverse RFFT 47 | return np.fft.irfft(Y) 48 | 49 | 50 | def ms2smp(ms, fs): 51 | """ 52 | Parameters 53 | ---------- 54 | ms: float 55 | Time in milliseconds 56 | fs: float 57 | Sampling rate in Hz. 58 | """ 59 | ​ 60 | # return corresponding length in samples 61 | 62 | 63 | def compute_stride(grain_len_samp, grain_over): 64 | return grain_len_samp - int(grain_len_samp * grain_over / 2) - 1 65 | 66 | 67 | def win_taper(grain_len_samp, grain_over, data_type=np.int16): 68 | 69 | edge_over = int(grain_len_samp * grain_over / 2) 70 | r = np.arange(0, edge_over) / float(edge_over) 71 | win = np.concatenate((r, 72 | np.ones(grain_len_samp-2*edge_over), 73 | r[::-1])) 74 | max_val = np.iinfo(data_type).max 75 | 76 | return (win*max_val).astype(data_type) 77 | 78 | -------------------------------------------------------------------------------- /scripts/filter_design/biquad_direct_form_1_incomplete.py: -------------------------------------------------------------------------------- 1 | """ 2 | Complete biquad implementation. 3 | """ 4 | 5 | from scipy.io import wavfile 6 | import numpy as np 7 | import os 8 | from utils import add_offset 9 | 10 | # parameters 11 | buffer_len = 128 12 | pole_coef = 0.95 13 | OFFSET = 5000 14 | 15 | # test signal 16 | input_wav = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 17 | samp_freq, signal = wavfile.read(input_wav) 18 | data_type = signal.dtype 19 | MAX_VAL = abs(np.iinfo(data_type).min) 20 | signal = signal[:, ] # get first channel 21 | n_buffers = len(signal)//buffer_len 22 | 23 | print("Sampling frequency : %d Hz" % samp_freq) 24 | print("Data type : %s" % data_type) 25 | 26 | # remove offset and add artificial one 27 | signal = add_offset(signal, OFFSET) 28 | wavfile.write("speech_off.wav", samp_freq, signal) 29 | 30 | # allocate input and output buffers 31 | input_buffer = np.zeros(buffer_len, dtype=data_type) 32 | output_buffer = np.zeros(buffer_len, dtype=data_type) 33 | 34 | # state variables 35 | def init(): 36 | 37 | # define filter parameters 38 | global b_coef, a_coef, HALF_MAX_VAL, GAIN, N_COEF 39 | GAIN = 0.8 40 | HALF_MAX_VAL = MAX_VAL // 2 41 | b_coef = [HALF_MAX_VAL, -2 * HALF_MAX_VAL, HALF_MAX_VAL] 42 | a_coef = [HALF_MAX_VAL, 43 | int(-2 * pole_coef * HALF_MAX_VAL), 44 | int(pole_coef * pole_coef * HALF_MAX_VAL)] 45 | N_COEF = len(a_coef) 46 | 47 | # declare variables used in `process` 48 | global y, x 49 | y = np.zeros(N_COEF, dtype=data_type) 50 | x = np.zeros(N_COEF, dtype=data_type) 51 | 52 | return 53 | 54 | 55 | # the process function! 56 | def process(input_buffer, output_buffer, buffer_len): 57 | 58 | # specify global variables modified here 59 | global y, x 60 | 61 | # process one sample at a time 62 | for n in range(buffer_len): 63 | 64 | # apply input gain 65 | x[0] = int(GAIN * input_buffer[n]) 66 | 67 | # compute filter output 68 | output_buffer[n] = int(b_coef[0] * x[0] / HALF_MAX_VAL) 69 | for i in range(1, N_COEF): 70 | # TODO: add prev input and output according to block diagram 71 | output_buffer[n] += 0 72 | 73 | # update state variables 74 | y[0] = output_buffer[n] 75 | for i in reversed(range(1, N_COEF)): 76 | # TODO: shift prev values 77 | x[i] = 0 78 | y[i] = 0 79 | 80 | 81 | """ 82 | Nothing to touch after this! 83 | """ 84 | init() 85 | # simulate block based processing 86 | signal_proc = np.zeros(n_buffers*buffer_len, dtype=data_type) 87 | for k in range(n_buffers): 88 | 89 | # index the appropriate samples 90 | input_buffer = signal[k*buffer_len:(k+1)*buffer_len] 91 | process(input_buffer, output_buffer, buffer_len) 92 | signal_proc[k*buffer_len:(k+1)*buffer_len] = output_buffer 93 | 94 | # write to WAV 95 | wavfile.write("speech_mod.wav", samp_freq, signal_proc) 96 | 97 | 98 | """ 99 | Visualize / test 100 | """ 101 | import matplotlib.pyplot as plt 102 | 103 | ALPHA = 0.75 # transparency for plot 104 | 105 | plt.figure() 106 | plt.plot(np.arange(len(signal)) / samp_freq, signal, 'tab:blue', label="original", alpha=ALPHA) 107 | plt.plot(np.arange(len(signal_proc)) / samp_freq, signal_proc, 'tab:orange', label="biquad", alpha=ALPHA) 108 | plt.xlabel("Time [seconds]") 109 | plt.grid() 110 | f = plt.gca() 111 | f.axes.get_yaxis().set_ticks([0]) 112 | plt.legend() 113 | 114 | plt.show() 115 | -------------------------------------------------------------------------------- /scripts/filter_design/biquad_direct_form_2_incomplete.py: -------------------------------------------------------------------------------- 1 | """ 2 | Complete biquad implementation. 3 | """ 4 | 5 | from scipy.io import wavfile 6 | import numpy as np 7 | import os 8 | from utils import add_offset 9 | 10 | # parameters 11 | buffer_len = 128 12 | pole_coef = 0.95 13 | OFFSET = 5000 14 | 15 | # test signal 16 | input_wav = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 17 | samp_freq, signal = wavfile.read(input_wav) 18 | data_type = signal.dtype 19 | MAX_VAL = abs(np.iinfo(data_type).min) 20 | signal = signal[:, ] # get first channel 21 | n_buffers = len(signal)//buffer_len 22 | 23 | print("Sampling frequency : %d Hz" % samp_freq) 24 | print("Data type : %s" % data_type) 25 | 26 | # remove offset and add artificial one 27 | signal = add_offset(signal, OFFSET) 28 | wavfile.write("speech_off.wav", samp_freq, signal) 29 | 30 | # allocate input and output buffers 31 | input_buffer = np.zeros(buffer_len, dtype=data_type) 32 | output_buffer = np.zeros(buffer_len, dtype=data_type) 33 | 34 | # state variables 35 | def init(): 36 | 37 | # define filter parameters 38 | global b_coef, a_coef, HALF_MAX_VAL, GAIN, N_COEF 39 | GAIN = 0.8 40 | HALF_MAX_VAL = MAX_VAL // 2 41 | b_coef = [HALF_MAX_VAL, -2 * HALF_MAX_VAL, HALF_MAX_VAL] 42 | a_coef = [HALF_MAX_VAL, 43 | int(-2 * pole_coef * HALF_MAX_VAL), 44 | int(pole_coef * pole_coef * HALF_MAX_VAL)] 45 | N_COEF = len(a_coef) 46 | 47 | # declare variables used in `process` 48 | global w 49 | w = list(np.zeros(N_COEF, dtype=data_type)) # doesn't work with numpy array for some reason... 50 | 51 | return 52 | 53 | 54 | # the process function! 55 | def process(input_buffer, output_buffer, buffer_len): 56 | 57 | # specify global variables modified here 58 | global w 59 | 60 | # process one sample at a time 61 | for n in range(buffer_len): 62 | 63 | # apply input gain 64 | w[0] = int(GAIN * input_buffer[n]) 65 | 66 | # compute contribution from state variables 67 | for i in range(1, N_COEF): 68 | # TODO: accumulate signal at top-left adder using prev `w` (middle column) 69 | w[0] -= 0 70 | 71 | # compute output 72 | output_buffer[n] = 0 73 | for i in range(N_COEF): 74 | # TODO: accumulate signal at top-right adder using `w` 75 | output_buffer[n] += 0 76 | 77 | # update state variables 78 | for i in reversed(range(1, N_COEF)): 79 | # TODO: shift prev values 80 | w[i] = 0 81 | 82 | 83 | """ 84 | Nothing to touch after this! 85 | """ 86 | init() 87 | # simulate block based processing 88 | signal_proc = np.zeros(n_buffers*buffer_len, dtype=data_type) 89 | for k in range(n_buffers): 90 | 91 | # index the appropriate samples 92 | input_buffer = signal[k*buffer_len:(k+1)*buffer_len] 93 | process(input_buffer, output_buffer, buffer_len) 94 | signal_proc[k*buffer_len:(k+1)*buffer_len] = output_buffer 95 | 96 | # write to WAV 97 | wavfile.write("speech_mod.wav", samp_freq, signal_proc) 98 | 99 | 100 | """ 101 | Visualize / test 102 | """ 103 | import matplotlib.pyplot as plt 104 | 105 | ALPHA = 0.75 # transparency for plot 106 | 107 | plt.figure() 108 | plt.plot(np.arange(len(signal)) / samp_freq, signal, 'tab:blue', label="original", alpha=ALPHA) 109 | plt.plot(np.arange(len(signal_proc)) / samp_freq, signal_proc, 'tab:orange', label="biquad", alpha=ALPHA) 110 | plt.xlabel("Time [seconds]") 111 | plt.grid() 112 | f = plt.gca() 113 | f.axes.get_yaxis().set_ticks([0]) 114 | plt.legend() 115 | 116 | plt.show() 117 | -------------------------------------------------------------------------------- /scripts/filter_design/fir_comparison.py: -------------------------------------------------------------------------------- 1 | """ 2 | Compare the simple filter with other FIR filters that have been designed using the windwo method. 3 | """ 4 | 5 | import numpy as np 6 | from scipy import signal 7 | import matplotlib.pyplot as plt 8 | 9 | 10 | def freq2rad(freq, fs): 11 | return freq * np.pi / (fs/2) 12 | 13 | 14 | def rad2freq(rad, fs): 15 | return rad * (fs/2) / np.pi 16 | 17 | 18 | fs = 16000 19 | filter_order = [40, 110, 180, 250, 320] 20 | cutoff = 100. # in Hz 21 | 22 | # for plotting 23 | ALPHA = 0.8 24 | f_max = 1000 25 | 26 | # normalized cutoff 27 | nyq = 0.5 * fs 28 | fc_norm = cutoff / nyq 29 | 30 | # prepare figure 31 | plt.figure() 32 | 33 | # simple filter 34 | b = np.array([1, -1]) 35 | w, h = signal.freqz(b) 36 | plt.semilogx([rad2freq(rad, fs) for rad in w], 37 | 20 * np.log10(abs(h)), 38 | label="simple (2-tap)", 39 | alpha=ALPHA) 40 | 41 | 42 | # compare FIR filters of different lengths 43 | for order in filter_order: 44 | # design filter 45 | b = signal.firwin(numtaps=order + 1, cutoff=fc_norm, window="hanning", pass_zero=False) 46 | 47 | # visualize response 48 | w, h = signal.freqz(b) 49 | plt.semilogx([rad2freq(rad, fs) for rad in w], 50 | 20 * np.log10(abs(h)), 51 | label="%d-tap FIR" % (order + 1), 52 | alpha=ALPHA) 53 | 54 | plt.margins(0, 0.1) 55 | plt.title("Frequency response (log scale)") 56 | plt.xlabel("Frequency [Hz]") 57 | plt.ylabel("Magnitude [dB]") 58 | plt.ylim([-50, 10]) 59 | plt.grid() 60 | plt.legend(loc="lower right") 61 | plt.tight_layout() 62 | 63 | plt.show() 64 | -------------------------------------------------------------------------------- /scripts/filter_design/fir_comparison_example.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy.io import wavfile 3 | import os 4 | import matplotlib.pyplot as plt 5 | from scipy.signal import firwin, lfilter 6 | from utils import add_offset 7 | 8 | 9 | def apply_fir(audio, b): 10 | y_fir = lfilter(b, a=1, x=audio) 11 | wavfile.write(filename="audio_hpf_{}.wav".format(len(b)), 12 | rate=fs, data=y_fir.astype(data_type)) 13 | 14 | plt.figure() 15 | plt.plot(time_vec, audio, 'tab:blue', label="original", alpha=ALPHA) 16 | plt.plot(time_vec, y_fir, 'tab:orange', label="{}-tap".format(len(b)), alpha=ALPHA) 17 | plt.xlabel("Time [seconds]") 18 | plt.grid() 19 | f = plt.gca() 20 | f.axes.get_yaxis().set_ticks([0]) 21 | plt.legend() 22 | 23 | 24 | fp = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 25 | OFFSET = 5000 26 | ALPHA = 0.75 # transparency for plot 27 | 28 | # load signal 29 | fs, audio = wavfile.read(fp) 30 | data_type = audio.dtype 31 | time_vec = np.arange(len(audio)) / fs 32 | 33 | # add articifial offset 34 | audio_off = add_offset(audio, OFFSET) 35 | 36 | # apply different filters 37 | fir_order = [40, 320] 38 | cutoff = 100. 39 | nyq = 0.5 * fs 40 | fc_norm = cutoff / nyq 41 | 42 | for order in fir_order: 43 | b = firwin(numtaps=order+1, cutoff=fc_norm, window="hanning", pass_zero=False) 44 | apply_fir(audio_off, b) 45 | 46 | plt.show() 47 | -------------------------------------------------------------------------------- /scripts/filter_design/hpf_comparison.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy.io import wavfile 3 | import os 4 | import matplotlib.pyplot as plt 5 | from scipy.signal import firwin, lfilter, freqz 6 | from utils import add_offset 7 | 8 | # parameters 9 | fir_win_order = 180; cutoff = 100. 10 | ma_order = 40 11 | pole_coef = 0.95 12 | OFFSET = 5000 13 | 14 | # load signal 15 | fp = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 16 | fs, audio = wavfile.read(fp) 17 | data_type = audio.dtype 18 | time_vec = np.arange(len(audio)) / fs 19 | nyq = 0.5 * fs 20 | fc_norm = cutoff / nyq 21 | 22 | # add articifial offset 23 | audio_off = add_offset(audio, OFFSET) 24 | 25 | # prepare figure 26 | ALPHA = 0.75 # transparency for plot 27 | plt.figure() 28 | plt.plot(time_vec, audio_off, label="original", alpha=ALPHA) 29 | 30 | # window approach 31 | b_win = firwin(numtaps=fir_win_order + 1, cutoff=fc_norm, window="hanning", pass_zero=False) 32 | y_fir_win = lfilter(b_win, a=1, x=audio_off) 33 | plt.plot(time_vec, y_fir_win, label="FIR window, %d taps" % (fir_win_order+1), alpha=ALPHA) 34 | 35 | # moving average approach 36 | b_ma = -1*np.ones(ma_order)/ma_order 37 | b_ma[0] = 1 + b_ma[0] 38 | y_ma = lfilter(b_ma, a=1, x=audio_off) 39 | plt.plot(time_vec, y_fir_win, label="MA, %d taps" % ma_order, alpha=ALPHA) 40 | 41 | # first order 42 | b_iir = np.array([1., -1.]) 43 | a_iir = np.array([1, -1 * pole_coef]) 44 | y_iir = lfilter(b_iir, a=a_iir, x=audio_off) 45 | plt.plot(time_vec, y_iir, label="Single pole, 3 taps", alpha=ALPHA) 46 | 47 | plt.xlabel("Time [seconds]") 48 | plt.grid() 49 | f = plt.gca() 50 | f.axes.get_yaxis().set_ticks([0]) 51 | plt.legend() 52 | 53 | 54 | """ 55 | Frequency response 56 | """ 57 | def rad2freq(rad, fs): 58 | return rad * (fs/2) / np.pi 59 | 60 | plt.figure() 61 | 62 | w, h = freqz(b_win) 63 | plt.semilogx([rad2freq(rad, fs) for rad in w], 64 | 20 * np.log10(abs(h)), 65 | label="FIR window, %d taps" % (fir_win_order+1), 66 | alpha=ALPHA) 67 | 68 | w, h = freqz(b_ma) 69 | plt.semilogx([rad2freq(rad, fs) for rad in w], 70 | 20 * np.log10(abs(h)), 71 | label="MA, %d taps" % ma_order, 72 | alpha=ALPHA) 73 | 74 | w, h = freqz(b_iir, a_iir) 75 | plt.semilogx([rad2freq(rad, fs) for rad in w], 76 | 20 * np.log10(abs(h)), 77 | label="Single pole, 3 taps", 78 | alpha=ALPHA) 79 | 80 | plt.margins(0, 0.1) 81 | plt.title("Frequency response (log scale)") 82 | plt.xlabel("Frequency [Hz]") 83 | plt.ylabel("Magnitude [dB]") 84 | plt.ylim([-20, 5]) 85 | plt.grid() 86 | plt.legend(loc="lower right") 87 | plt.tight_layout() 88 | 89 | plt.show() 90 | -------------------------------------------------------------------------------- /scripts/filter_design/iir_comparison.py: -------------------------------------------------------------------------------- 1 | """ 2 | Compare various IIR filters 3 | """ 4 | 5 | import numpy as np 6 | from scipy import signal 7 | import matplotlib.pyplot as plt 8 | 9 | 10 | def freq2rad(freq, fs): 11 | return freq * np.pi / (fs/2) 12 | 13 | 14 | def rad2freq(rad, fs): 15 | return rad * (fs/2) / np.pi 16 | 17 | 18 | # MAIN PARAMETER 19 | pole_coef = 0.95 20 | fs = 16000 21 | 22 | # prepare figure 23 | ALPHA = 0.8 24 | f_max = 4000 25 | plt.figure() 26 | 27 | # simple filter 28 | b = np.array([1, -1]) 29 | w, h = signal.freqz(b) 30 | plt.semilogx([rad2freq(rad, fs) for rad in w], 31 | 20 * np.log10(abs(h)), 32 | label="simple (2-tap)", 33 | alpha=ALPHA) 34 | 35 | # First order single pole 36 | b = np.array([1., -1.]) 37 | a = np.array([1, -1*pole_coef]) 38 | 39 | w, h = signal.freqz(b, a) 40 | plt.semilogx([rad2freq(rad, fs) for rad in w], 41 | 20 * np.log10(abs(h)), 42 | label="1-stage", 43 | alpha=ALPHA) 44 | 45 | # (2nd order) 46 | b = np.array([1., -2., 1.]) 47 | a = np.array([1, -2*pole_coef, pole_coef*pole_coef]) 48 | 49 | w, h = signal.freqz(b, a) 50 | plt.semilogx([rad2freq(rad, fs) for rad in w], 51 | 20 * np.log10(abs(h)), 52 | label="2-stage", 53 | alpha=ALPHA) 54 | 55 | # (3rd order) 56 | b = np.array([1., -3., 3., -1.]) 57 | a = np.array([1, -3*pole_coef, 3*pole_coef*pole_coef, -1*pole_coef**3]) 58 | 59 | w, h = signal.freqz(b, a) 60 | plt.semilogx([rad2freq(rad, fs) for rad in w], 61 | 20 * np.log10(abs(h)), 62 | label="3-stage", 63 | alpha=ALPHA) 64 | 65 | 66 | plt.margins(0, 0.1) 67 | plt.title("Frequency response for varying num. of stages (log scale)") 68 | plt.xlabel("Frequency [Hz]") 69 | plt.ylabel("Magnitude [dB]") 70 | plt.grid() 71 | plt.legend(loc="lower right") 72 | plt.tight_layout() 73 | 74 | plt.show() 75 | -------------------------------------------------------------------------------- /scripts/filter_design/moving_average_approach.py: -------------------------------------------------------------------------------- 1 | """ 2 | Compare moving average approach with different lengths 3 | """ 4 | 5 | import numpy as np 6 | from scipy import signal 7 | import matplotlib.pyplot as plt 8 | 9 | 10 | def rad2freq(rad, fs): 11 | return rad * (fs/2) / np.pi 12 | 13 | 14 | fs = 16000 15 | filter_order = [5, 10, 20, 40, 80] 16 | cutoff = 100. # in Hz 17 | 18 | # for plotting 19 | ALPHA = 0.8 20 | f_max = 1000 21 | 22 | # normalized cutoff 23 | nyq = 0.5 * fs 24 | fc_norm = cutoff / nyq 25 | 26 | # prepare figure 27 | plt.figure() 28 | 29 | for N in filter_order: 30 | 31 | b = -1*np.ones(N)/N 32 | b[0] = 1 + b[0] 33 | w, h = signal.freqz(b) 34 | plt.semilogx([rad2freq(rad, fs) for rad in w], 35 | 20 * np.log10(abs(h)), 36 | label=N, 37 | alpha=ALPHA) 38 | 39 | plt.margins(0, 0.1) 40 | plt.title("Frequency response (log scale)") 41 | plt.xlabel("Frequency [Hz]") 42 | plt.ylabel("Magnitude [dB]") 43 | plt.ylim([-40, 10]) 44 | plt.grid() 45 | plt.legend(loc="lower right") 46 | plt.tight_layout() 47 | 48 | plt.show() 49 | 50 | -------------------------------------------------------------------------------- /scripts/filter_design/show_simple_filter_flaw.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy.io import wavfile 3 | import os 4 | import matplotlib.pyplot as plt 5 | from utils import add_offset 6 | 7 | 8 | fp = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 9 | OFFSET = 5000 10 | ALPHA = 0.75 # transparency for plot 11 | 12 | # load signal 13 | fs, audio = wavfile.read(fp) 14 | data_type = audio.dtype 15 | time_vec = np.arange(len(audio)) / fs 16 | 17 | # add articifial offset 18 | audio_off = add_offset(audio, OFFSET) 19 | 20 | plt.figure() 21 | plt.plot(time_vec, audio, 'tab:blue', label="original", alpha=ALPHA) 22 | plt.plot(time_vec, audio_off, 'tab:orange', label="offset", alpha=ALPHA) 23 | plt.xlabel("Time [seconds]") 24 | plt.grid() 25 | f = plt.gca() 26 | f.axes.get_yaxis().set_ticks([0]) 27 | plt.legend() 28 | 29 | # apply simple filter 30 | prev_samples = np.roll(audio_off, 1) 31 | prev_samples[0] = 0 32 | audio_hpf_simple = audio_off - prev_samples 33 | 34 | # comparisons 35 | plt.figure() 36 | plt.plot(time_vec, audio_off, 'tab:orange', label="offset", alpha=ALPHA) 37 | plt.plot(time_vec, audio_hpf_simple, 'tab:green', label="simple hpf", alpha=ALPHA) 38 | plt.xlabel("Time [seconds]") 39 | plt.grid() 40 | f = plt.gca() 41 | f.axes.get_yaxis().set_ticks([0]) 42 | plt.legend() 43 | 44 | plt.figure() 45 | plt.plot(time_vec, audio, 'tab:blue', label="original", alpha=ALPHA) 46 | plt.plot(time_vec, audio_hpf_simple, 'tab:green', label="simple hpf", alpha=ALPHA) 47 | plt.xlabel("Time [seconds]") 48 | plt.grid() 49 | f = plt.gca() 50 | f.axes.get_yaxis().set_ticks([0]) 51 | plt.legend() 52 | 53 | # write to file to listen 54 | wavfile.write("audio_hpf_simple.wav", fs, audio_hpf_simple.astype(data_type)) 55 | 56 | plt.show() 57 | -------------------------------------------------------------------------------- /scripts/filter_design/utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def add_offset(signal, offset): 5 | """ 6 | Add an artificial offset to the provided signal. 7 | 8 | :param signal: Original mono signal (which may already have offset). 9 | :param offset: Artificial DC offset to add 10 | :return: 11 | """ 12 | 13 | # get data type 14 | data_type = signal.dtype 15 | try: 16 | # integer type 17 | MAX_VAL = abs(np.iinfo(data_type).min) 18 | except: 19 | # float type 20 | MAX_VAL = abs(np.finfo(data_type).min) 21 | 22 | # new max val to normalize within 23 | _max_val = MAX_VAL + offset 24 | 25 | # remove offset if already there 26 | signal = signal - np.mean(signal) 27 | signal = ((signal / _max_val) * MAX_VAL + offset).astype(data_type) 28 | 29 | return signal 30 | 31 | -------------------------------------------------------------------------------- /scripts/filter_design/varying_single_pole.py: -------------------------------------------------------------------------------- 1 | """ 2 | Vary coefficient for pole. 3 | """ 4 | 5 | import numpy as np 6 | from scipy import signal 7 | import matplotlib.pyplot as plt 8 | 9 | 10 | def freq2rad(freq, fs): 11 | return freq * np.pi / (fs/2) 12 | 13 | 14 | def rad2freq(rad, fs): 15 | return rad * (fs/2) / np.pi 16 | 17 | 18 | pole_coef = [0, 0.5, 0.75, 0.9, 0.95] 19 | 20 | fs = 16000 21 | 22 | # prepare figure 23 | ALPHA = 0.8 24 | f_max = 4000 25 | plt.figure() 26 | 27 | for R in pole_coef: 28 | b = np.array([1., -1.]) 29 | a = np.array([1, -R]) 30 | w, h = signal.freqz(b, a) 31 | plt.semilogx([rad2freq(rad, fs) for rad in w], 32 | 20 * np.log10(abs(h)), 33 | label=R, 34 | alpha=ALPHA) 35 | 36 | plt.margins(0, 0.1) 37 | plt.title("Single pole frequency response (log scale)") 38 | plt.xlabel("Frequency [Hz]") 39 | plt.ylabel("Magnitude [dB]") 40 | plt.grid() 41 | plt.legend(loc="lower right") 42 | plt.tight_layout() 43 | 44 | plt.show() 45 | -------------------------------------------------------------------------------- /scripts/granular_synthesis/grains_viz.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | 4 | from utils import ms2smp, double_len, double_len_taper 5 | 6 | f = 100 7 | grain_len = 32 # ms 8 | overlap = 0.3 9 | duration = 100 # ms 10 | disp = 60 11 | fs = 16000 12 | 13 | # original 14 | time = np.arange(int(duration*1e-3*fs))/fs 15 | x = np.sin(2*np.pi*f*time) 16 | 17 | # double length 18 | grain_len_samp = ms2smp(grain_len, fs) 19 | x_double = double_len(x, grain_len_samp) 20 | time_double = np.arange(len(x_double))/fs 21 | 22 | # double length with overlap/window 23 | x_double_win, stride_samp, grains = double_len_taper(x, grain_len_samp, overlap) 24 | stride_len = stride_samp/fs*1000 25 | time_double_win = np.arange(len(x_double_win))/fs 26 | 27 | 28 | # visualize discontinuous 29 | f, (ax1, ax2) = plt.subplots(2,1) 30 | 31 | ax1.plot(time, x) 32 | ax1.grid() 33 | ax1.set_ylabel("Original", fontsize=18) 34 | ax1.set_xlim([0,disp*1e-3]) 35 | ax1.get_yaxis().set_ticklabels([]) 36 | 37 | ax2.plot(time_double, x_double) 38 | for k in range(1, 2*duration//grain_len+1): 39 | if k%2: # across doubling (discontinuity) 40 | ax2.axvline(x=k*grain_len*1e-3, c='r', ls='--', lw=1) 41 | else: 42 | ax2.axvline(x=k*grain_len*1e-3, c='g', ls='--', lw=1) 43 | ax2.grid() 44 | ax2.set_ylabel("Double", fontsize=18) 45 | ax2.set_xlim([0,2*disp*1e-3]) 46 | ax2.set_xlabel("Time [seconds]", fontsize=18) 47 | ax2.get_yaxis().set_ticklabels([]) 48 | 49 | plt.savefig("doubling_discontinuity.png", format='png', dpi=300) 50 | 51 | # visualize continuous 52 | f, (ax1, ax2, ax3) = plt.subplots(3,1) 53 | 54 | ax1.plot(time, x) 55 | ax1.grid() 56 | ax1.set_ylabel("Original", fontsize=18) 57 | ax1.set_xlim([0,disp*1e-3]) 58 | ax1.get_yaxis().set_ticklabels([]) 59 | 60 | for k, grain in enumerate(grains): 61 | grain_padded = np.zeros(len(time_double_win)) 62 | start_samp = k*stride_samp 63 | end_samp = start_samp + grain_len_samp 64 | grain_padded[start_samp:end_samp] = grain 65 | ax2.plot(time_double_win, grain_padded) 66 | ax2.grid() 67 | ax2.set_ylabel("Grains", fontsize=18) 68 | ax2.set_xlim([0,2*disp*1e-3]) 69 | ax2.get_yaxis().set_ticklabels([]) 70 | 71 | ax3.plot(time_double_win, x_double_win) 72 | for k in range(1, 2*int(duration//stride_len)+1): 73 | if k%2: # across doubling (discontinuity) 74 | ax3.axvline(x=k*stride_len*1e-3, c='r', ls='--', lw=1) 75 | else: 76 | ax3.axvline(x=k*stride_len*1e-3, c='g', ls='--', lw=1) 77 | ax3.grid() 78 | ax3.set_ylabel("Windowed", fontsize=18) 79 | ax3.set_xlim([0,2*disp*1e-3]) 80 | ax3.set_xlabel("Time [seconds]", fontsize=18) 81 | ax3.get_yaxis().set_ticklabels([]) 82 | 83 | plt.savefig("doubling_continuous.png", format='png', dpi=300) 84 | 85 | plt.show() -------------------------------------------------------------------------------- /scripts/granular_synthesis/granular_synthesis_incomplete.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy.io import wavfile 3 | import os 4 | from utils import ms2smp, compute_stride, win_taper, build_linear_interp_table 5 | 6 | """ 7 | Pitch shifting with granular synthesis for shift factors <=1.0 8 | """ 9 | 10 | """ User selected parameters """ 11 | input_wav = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "_templates", "speech.wav") 12 | grain_len = 20 # in milliseconds 13 | grain_over = 0.3 # grain overlap (0,1) 14 | shift_factor = 0.7 # <= 1.0 15 | 16 | # open WAV file 17 | samp_freq, signal = wavfile.read(input_wav) 18 | if len(signal.shape)>1 : 19 | signal = signal[:,0] # get first channel 20 | data_type = signal.dtype 21 | MAX_VAL = np.iinfo(data_type).max 22 | 23 | # derived parameters 24 | GRAIN_LEN_SAMP = ms2smp(grain_len, samp_freq) 25 | STRIDE = compute_stride(GRAIN_LEN_SAMP, grain_over) 26 | OVERLAP_LEN = GRAIN_LEN_SAMP-STRIDE 27 | 28 | # allocate input and output buffers 29 | input_buffer = np.zeros(STRIDE, dtype=data_type) 30 | output_buffer = np.zeros(STRIDE, dtype=data_type) 31 | 32 | # state variables and constants 33 | def init(): 34 | 35 | # lookup table for tapering window 36 | global WIN 37 | WIN = win_taper(GRAIN_LEN_SAMP, grain_over, data_type) 38 | 39 | # lookup table for linear interpolation 40 | global SAMP_VALS 41 | global AMP_VALS 42 | SAMP_VALS, AMP_VALS = build_linear_interp_table(GRAIN_LEN_SAMP, shift_factor, data_type) 43 | 44 | # TODO: create arrays to pass between buffers (state variables) 45 | global ... 46 | 47 | # TODO: create arrays for intermediate values 48 | global ... 49 | 50 | 51 | # the process function! 52 | def process(input_buffer, output_buffer, buffer_len): 53 | 54 | # TODO: need to specify those global variables changing in this function (state variables and intermediate values) 55 | global ... 56 | 57 | # TODO: append samples from previous buffer 58 | for n in range(GRAIN_LEN_SAMP): 59 | ... 60 | 61 | # TODO: resample grain 62 | for n in range(GRAIN_LEN_SAMP): 63 | ... 64 | 65 | # TODO: apply window 66 | for n in range(GRAIN_LEN_SAMP): 67 | ... 68 | 69 | # TODO: write to output and update state variables 70 | for n in range(GRAIN_LEN_SAMP): 71 | # overlapping part 72 | if n < OVERLAP_LEN: 73 | ... 74 | # non-overlapping part 75 | elif n < STRIDE: 76 | ... 77 | # update state variables 78 | else: 79 | ... 80 | 81 | 82 | """ 83 | Nothing to touch after this! 84 | """ 85 | init() 86 | # simulate block based processing 87 | n_buffers = len(signal)//STRIDE 88 | signal_proc = np.zeros(n_buffers*STRIDE, dtype=data_type) 89 | for k in range(n_buffers): 90 | 91 | # sample indices 92 | start_idx = k*STRIDE 93 | end_idx = (k+1)*STRIDE 94 | 95 | # index the appropriate samples 96 | input_buffer = signal[start_idx:end_idx] 97 | process(input_buffer, output_buffer, STRIDE) 98 | signal_proc[start_idx:end_idx] = output_buffer 99 | 100 | # write to WAV 101 | file_name = "output_gran_synth.wav" 102 | print("Result written to: %s" % file_name) 103 | wavfile.write(file_name, samp_freq, signal_proc) 104 | 105 | -------------------------------------------------------------------------------- /scripts/granular_synthesis/granular_synthesis_sounddevice_incomplete.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from utils import ms2smp, compute_stride, win_taper, build_linear_interp_table 3 | import sounddevice as sd 4 | 5 | """ 6 | Real-time pitch shifting with granular synthesis for shift factors <=1.0 7 | """ 8 | 9 | """ User selected parameters """ 10 | grain_len = 30 11 | grain_over = 0.2 12 | shift_factor = 0.7 13 | data_type = np.int16 14 | samp_freq = 16000 15 | 16 | # derived parameters 17 | MAX_VAL = np.iinfo(data_type).max 18 | GRAIN_LEN_SAMP = ms2smp(grain_len, samp_freq) 19 | STRIDE = compute_stride(GRAIN_LEN_SAMP, grain_over) 20 | OVERLAP_LEN = GRAIN_LEN_SAMP-STRIDE 21 | 22 | # allocate input and output buffers 23 | input_buffer = np.zeros(STRIDE, dtype=data_type) 24 | output_buffer = np.zeros(STRIDE, dtype=data_type) 25 | 26 | 27 | # state variables and constants 28 | def init(): 29 | ... 30 | 31 | 32 | # the process function! 33 | def process(input_buffer, output_buffer, buffer_len): 34 | ... 35 | 36 | 37 | """ 38 | # Nothing to touch after this! 39 | # """ 40 | try: 41 | sd.default.samplerate = samp_freq 42 | sd.default.blocksize = STRIDE 43 | sd.default.dtype = data_type 44 | 45 | def callback(indata, outdata, frames, time, status): 46 | if status: 47 | print(status) 48 | process(indata[:,0], outdata[:,0], frames) 49 | 50 | init() 51 | with sd.Stream(channels=1, callback=callback): 52 | print('#' * 80) 53 | print('press Return to quit') 54 | print('#' * 80) 55 | input() 56 | except KeyboardInterrupt: 57 | print('\nInterrupted by user') 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /scripts/granular_synthesis/resample_viz.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | from utils import resample 4 | 5 | n_samples = 20 6 | fact_up = 2 7 | fact_down = 0.6 8 | 9 | t_orig = np.arange(n_samples) 10 | samples = np.random.randn(n_samples)*64 11 | 12 | samples_hi = resample(samples, fact_up) 13 | t_hi = np.arange(len(samples_hi)) 14 | 15 | samples_low = resample(samples, fact_down) 16 | t_lo = np.arange(len(samples_low)) 17 | 18 | f, (ax1, ax2, ax3) = plt.subplots(3,1) 19 | ax1.stem(t_orig, samples) 20 | ax1.plot(t_orig, samples) 21 | ax1.set_ylabel("Original (%d)" % n_samples) 22 | ax1.set_xlim([0,n_samples/fact_down]) 23 | ax1.grid() 24 | 25 | ax2.stem(t_orig/fact_down, samples, label="Original") 26 | ax2.plot(t_lo, samples_low, 'r') 27 | ax2.stem(t_lo, samples_low, 'r', markerfmt='r^') 28 | ax2.set_ylabel("Darth Vader (%d)" % (len(samples_low))) 29 | ax2.legend() 30 | ax2.set_xlim([0,n_samples/fact_down]) 31 | ax2.grid() 32 | 33 | ax3.stem(t_orig/fact_up, samples, label="Original") 34 | ax3.plot(t_hi, samples_hi, 'g') 35 | ax3.stem(t_hi, samples_hi, 'g', markerfmt='g^') 36 | ax3.set_ylabel("Chipmunk (%d)" % (len(samples_hi))) 37 | ax3.set_xlim([0,n_samples/fact_down]) 38 | ax3.grid() 39 | ax3.legend() 40 | 41 | plt.show() -------------------------------------------------------------------------------- /scripts/granular_synthesis/utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def ms2smp(ms, fs): 5 | """ 6 | Parameters 7 | ---------- 8 | ms: float 9 | Time in milliseconds 10 | fs: float 11 | Sampling rate in Hz. 12 | """ 13 | 14 | # return corresponding length in samples 15 | return int(float(fs) * float(ms) / 1000.0) 16 | 17 | 18 | def compute_stride(grain_len_samp, grain_over): 19 | return grain_len_samp - int(grain_len_samp * grain_over / 2) - 1 20 | 21 | 22 | def win_taper(grain_len_samp, grain_over, data_type=np.int16): 23 | 24 | edge_over = int(grain_len_samp * grain_over / 2) 25 | r = np.arange(0, edge_over) / float(edge_over) 26 | win = np.concatenate((r, 27 | np.ones(grain_len_samp-2*edge_over), 28 | r[::-1])) 29 | max_val = np.iinfo(data_type).max 30 | 31 | return (win*max_val).astype(data_type) 32 | 33 | 34 | def build_linear_interp_table(n_samples, down_fact, data_type=np.int16): 35 | 36 | samp_vals = [] 37 | amp_vals = [] 38 | for n in range(n_samples): 39 | # compute t, N, and a 40 | 41 | samp_vals.append(N) 42 | amp_vals.append(a) 43 | 44 | MAX_VAL = np.iinfo(data_type).max 45 | amp_vals = np.array(amp_vals) 46 | amp_vals = (amp_vals*MAX_VAL).astype(data_type) 47 | 48 | return samp_vals, amp_vals 49 | -------------------------------------------------------------------------------- /scripts/granular_synthesis/variable_sharing_viz.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | 4 | from utils import win_taper, ms2smp 5 | 6 | grain_len = 35 # ms 7 | overlap = 0.3 8 | fs = 16000 9 | data_type = np.int16 10 | 11 | # derived parameters 12 | MAX_VAL = np.iinfo(data_type).max 13 | grain_len_samp = ms2smp(grain_len, fs) 14 | STRIDE = grain_len_samp - int(grain_len_samp*overlap/2)-1 15 | overlap_samp = grain_len_samp - STRIDE 16 | 17 | # create window 18 | WINDOW = win_taper(grain_len_samp, overlap, data_type) 19 | WINDOW = WINDOW/MAX_VAL 20 | 21 | # viz 22 | plt.figure() 23 | plt.plot(np.arange(grain_len_samp), WINDOW, 'b') 24 | plt.axvline(x=overlap_samp, c='k', ls='--', lw=2, label="buffer start") 25 | plt.plot(np.arange(grain_len_samp)+STRIDE, WINDOW, 'b') 26 | plt.axvline(x=STRIDE, c='r', ls='--', lw=2, label="overlap start") 27 | plt.axvline(x=overlap_samp+STRIDE, c='k', ls='-.', lw=2, label="buffer end") 28 | plt.plot(np.arange(grain_len_samp)+2*STRIDE, WINDOW, 'b') 29 | plt.ylim([0, 1.1]) 30 | plt.xlim([0, 2*STRIDE]) 31 | plt.grid() 32 | plt.xlabel("Sample number", fontsize=18) 33 | # plt.legend(fontsize=18, loc=4) 34 | plt.legend(bbox_to_anchor=(0.65, 1), loc=2, borderaxespad=0., fontsize=18) 35 | 36 | plt.show() -------------------------------------------------------------------------------- /scripts/granular_synthesis/windowing_viz.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | 4 | from utils import win_taper, ms2smp 5 | 6 | grain_len = 35 # ms 7 | overlap = 0.3 8 | fs = 16000 9 | data_type = np.int16 10 | 11 | # derived parameters 12 | MAX_VAL = np.iinfo(data_type).max 13 | grain_len_samp = ms2smp(grain_len, fs) 14 | grain_stride = grain_len_samp - int(grain_len_samp * overlap / 2) - 1 15 | 16 | # create window 17 | WINDOW = win_taper(grain_len_samp, overlap, data_type) 18 | WINDOW = WINDOW/MAX_VAL 19 | time = np.arange(len(WINDOW))/fs 20 | 21 | # visualize 22 | plt.figure() 23 | plt.plot(time, WINDOW) 24 | plt.xlabel("Time [seconds]", fontsize=18) 25 | plt.grid() 26 | 27 | plt.savefig("taper_window.png", format='png', dpi=300) 28 | 29 | 30 | # align two windows using the given stride and sum them 31 | win1 = np.r_[WINDOW, np.zeros(grain_stride)] 32 | win2 = np.r_[np.zeros(grain_stride), WINDOW] 33 | time = np.arange(len(win1))/fs 34 | plt.figure() 35 | plt.plot(time, win1); 36 | plt.plot(time, win2); 37 | plt.grid() 38 | 39 | # if the windows are properly aligned, the tapered areas compensate 40 | plt.plot(time, win1 + win2, label="sum"); 41 | plt.legend(fontsize=18, loc=4) 42 | plt.xlabel("Time [seconds]", fontsize=18) 43 | 44 | plt.show() -------------------------------------------------------------------------------- /scripts/linear_prediction/compare_spectrum.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | from scipy.io import wavfile 4 | import matplotlib.pyplot as plt 5 | from utils_lpc import lpc 6 | 7 | MAX_VAL = 32767.0 #int16 8 | MAX_FREQ = 8000 9 | LPC_ORDER = 20 10 | 11 | 12 | def plot_spec(x, Fs, max_freq=None, do_fft=True, label=None): 13 | if max_freq is None: 14 | max_freq = Fs/2 15 | C = int(len(x) * max_freq / Fs) 16 | X = np.abs(np.fft.fft(x)[0:C]) if do_fft else x[0:C] 17 | N = Fs * np.arange(0, C) / len(x); 18 | plt.plot(N, X, label=label) 19 | plt.xlim([0, max_freq]) 20 | plt.xlabel("Frequency [Hz]") 21 | ax = plt.gca() 22 | ax.axes.yaxis.set_ticklabels([]) 23 | return N, X 24 | 25 | 26 | """ 27 | Compare energy envelope of original and granular-synthesis spectrum. 28 | """ 29 | current_dir = os.path.dirname(os.path.realpath(__file__)) 30 | input_wav = os.path.join(current_dir, "voiced.wav") 31 | mod_input_wav = os.path.join(current_dir, "voiced_gran_synth.wav") 32 | 33 | # import WAV files 34 | samp_freq, signal_orig = wavfile.read(input_wav) 35 | signal_orig = signal_orig/MAX_VAL 36 | samp_freq, signal_mod = wavfile.read(mod_input_wav) 37 | signal_mod = signal_mod/MAX_VAL 38 | 39 | # compute energy envelope 40 | A = np.fft.fft(lpc(signal_orig, LPC_ORDER), len(signal_orig)) 41 | A_mod = np.fft.fft(lpc(signal_mod, LPC_ORDER), len(signal_orig)) 42 | 43 | # plot 44 | plot_spec(signal_orig, samp_freq, label="original spectrum") 45 | plot_spec(np.abs(np.divide(1.0, A)), samp_freq, do_fft=False, label="energy (original)") 46 | plot_spec(np.abs(np.divide(1.0, A_mod)), samp_freq, do_fft=False, label="energy (granular synthesis)") 47 | plt.legend() 48 | plt.grid() 49 | 50 | 51 | plt.show() 52 | -------------------------------------------------------------------------------- /scripts/linear_prediction/compare_spectrum_lpc.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | from scipy.io import wavfile 4 | import matplotlib.pyplot as plt 5 | from utils_lpc import lpc 6 | 7 | MAX_VAL = 32767.0 #int16 8 | MAX_FREQ = 8000 9 | LPC_ORDER = 20 10 | 11 | 12 | def plot_spec(x, Fs, max_freq=None, do_fft=True, label=None): 13 | if max_freq is None: 14 | max_freq = Fs/2 15 | C = int(len(x) * max_freq / Fs) 16 | X = np.abs(np.fft.fft(x)[0:C]) if do_fft else x[0:C] 17 | N = Fs * np.arange(0, C) / len(x); 18 | plt.plot(N, X, label=label) 19 | plt.xlim([0, max_freq]) 20 | plt.xlabel("Frequency [Hz]") 21 | ax = plt.gca() 22 | ax.axes.yaxis.set_ticklabels([]) 23 | return N, X 24 | 25 | 26 | """ 27 | Compare energy envelope of original and granular-synthesis spectrum. 28 | """ 29 | current_dir = os.path.dirname(os.path.realpath(__file__)) 30 | input_wav = os.path.join(current_dir, "voiced.wav") 31 | mod_input_wav = os.path.join(current_dir, "voiced_gran_synth.wav") 32 | mod_input_wav_2 = os.path.join(current_dir, "voiced_gran_synth_lpc.wav") 33 | 34 | # import WAV files 35 | samp_freq, signal_orig = wavfile.read(input_wav) 36 | signal_orig = signal_orig/MAX_VAL 37 | samp_freq, signal_mod = wavfile.read(mod_input_wav) 38 | signal_mod = signal_mod/MAX_VAL 39 | samp_freq, signal_mod_lpc = wavfile.read(mod_input_wav_2) 40 | signal_mod_lpc = signal_mod_lpc/MAX_VAL 41 | 42 | # compute energy envelope 43 | A = np.fft.fft(lpc(signal_orig, LPC_ORDER), len(signal_orig)) 44 | A_mod = np.fft.fft(lpc(signal_mod, LPC_ORDER), len(signal_orig)) 45 | A_mod_lpc = np.fft.fft(lpc(signal_mod_lpc, LPC_ORDER), len(signal_orig)) 46 | 47 | # plot 48 | plot_spec(signal_orig, samp_freq, label="original spectrum") 49 | plot_spec(np.abs(np.divide(1.0, A)), samp_freq, do_fft=False, label="energy (original)") 50 | plot_spec(np.abs(np.divide(1.0, A_mod)), samp_freq, do_fft=False, label="energy (granular synthesis)") 51 | plot_spec(np.abs(np.divide(1.0, A_mod_lpc)), samp_freq, do_fft=False, label="energy (granular synthesis + lpc)") 52 | plt.legend() 53 | plt.grid() 54 | 55 | 56 | plt.show() 57 | -------------------------------------------------------------------------------- /scripts/linear_prediction/granular_synthesis_LPC_sounddevice_incomplete.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from utils import ms2smp, compute_stride, win_taper, build_linear_interp_table 3 | from utils_lpc import ld_eff 4 | import sounddevice as sd 5 | 6 | 7 | """ 8 | Real-time pitch shifting with granular synthesis for shift factors <=1.0 9 | """ 10 | 11 | """ User selected parameters """ 12 | grain_len = 30 13 | grain_over = 0.2 14 | shift_factor = 0.7 15 | LPC_ORDER = 25 16 | use_LPC = True 17 | GAIN = 0.5 18 | N_COEF = LPC_ORDER+1 19 | 20 | data_type = np.int16 21 | samp_freq = 16000 22 | 23 | # derived parameters 24 | MAX_VAL = np.iinfo(data_type).max 25 | GRAIN_LEN_SAMP = ms2smp(grain_len, samp_freq) 26 | STRIDE = compute_stride(GRAIN_LEN_SAMP, grain_over) 27 | OVERLAP_LEN = GRAIN_LEN_SAMP-STRIDE 28 | 29 | # allocate input and output buffers 30 | input_buffer = np.zeros(STRIDE, dtype=data_type) 31 | output_buffer = np.zeros(STRIDE, dtype=data_type) 32 | 33 | 34 | # state variables and constants 35 | def init(): 36 | ... 37 | 38 | 39 | # the process function! 40 | def process(input_buffer, output_buffer, buffer_len): 41 | ... 42 | 43 | 44 | """ 45 | # Nothing to touch after this! 46 | # """ 47 | try: 48 | sd.default.samplerate = samp_freq 49 | sd.default.blocksize = STRIDE 50 | sd.default.dtype = data_type 51 | 52 | def callback(indata, outdata, frames, time, status): 53 | if status: 54 | print(status) 55 | process(indata[:, 0], outdata[:, 0], frames) 56 | 57 | init() 58 | with sd.Stream(channels=1, callback=callback): 59 | print('#' * 80) 60 | print('press Return to quit') 61 | print('#' * 80) 62 | input() 63 | except KeyboardInterrupt: 64 | print('\nInterrupted by user') 65 | -------------------------------------------------------------------------------- /scripts/linear_prediction/test_lpc_utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | from scipy.io import wavfile 3 | import numpy as np 4 | from utils_lpc import lpc, lpc_eff 5 | 6 | 7 | MAX_VAL = 32767.0 #int16 8 | LPC_ORDER = 20 9 | TOL = 1e-10 10 | 11 | # import WAV file 12 | current_dir = os.path.dirname(os.path.realpath(__file__)) 13 | input_wav = os.path.join(current_dir, "voiced.wav") 14 | samp_freq, signal_orig = wavfile.read(input_wav) 15 | signal_orig = signal_orig/MAX_VAL 16 | 17 | 18 | a1 = lpc(signal_orig, LPC_ORDER) 19 | print() 20 | print("Correct LPC coefficients: ", end="") 21 | print(a1) 22 | print() 23 | 24 | a2 = lpc_eff(signal_orig, LPC_ORDER) 25 | print() 26 | print("Resulting LPC coefficients: ", end="") 27 | print(a2) 28 | print() 29 | 30 | if np.linalg.norm(a1-a2) < TOL: 31 | print("CORRECT!") 32 | else: 33 | print("Something's wrong...") 34 | 35 | -------------------------------------------------------------------------------- /scripts/linear_prediction/utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def ms2smp(ms, fs): 5 | """ 6 | Parameters 7 | ---------- 8 | ms: float 9 | Time in milliseconds 10 | fs: float 11 | Sampling rate in Hz. 12 | """ 13 | 14 | # return corresponding length in samples 15 | return int(float(fs) * float(ms) / 1000.0) 16 | 17 | 18 | def compute_stride(grain_len_samp, grain_over): 19 | return grain_len_samp - int(grain_len_samp * grain_over / 2) - 1 20 | 21 | 22 | def win_taper(grain_len_samp, grain_over, data_type=np.int16): 23 | 24 | edge_over = int(grain_len_samp * grain_over / 2) 25 | r = np.arange(0, edge_over) / float(edge_over) 26 | win = np.concatenate((r, 27 | np.ones(grain_len_samp-2*edge_over), 28 | r[::-1])) 29 | max_val = np.iinfo(data_type).max 30 | 31 | return (win*max_val).astype(data_type) 32 | 33 | 34 | def build_linear_interp_table(n_samples, down_fact, data_type=np.int16): 35 | 36 | samp_vals = [] 37 | amp_vals = [] 38 | for n in range(n_samples): 39 | # compute t, N, and a 40 | 41 | samp_vals.append(N) 42 | amp_vals.append(a) 43 | 44 | MAX_VAL = np.iinfo(data_type).max 45 | amp_vals = np.array(amp_vals) 46 | amp_vals = (amp_vals*MAX_VAL).astype(data_type) 47 | 48 | return samp_vals, amp_vals 49 | -------------------------------------------------------------------------------- /scripts/linear_prediction/utils_lpc.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def bac(x, p): 5 | # compute the biased autocorrelation for x up to lag p 6 | L = len(x) 7 | r = np.zeros(p+1) 8 | for m in range(0, p+1): 9 | for n in range(0, L-m): 10 | r[m] += x[n] * x[n+m] 11 | r[m] /= float(L) 12 | return r 13 | 14 | 15 | def ld(r, p): 16 | # solve the toeplitz system using the Levinson-Durbin algorithm 17 | g = r[1] / r[0] 18 | a = np.array([g]) 19 | v = (1. - g * g) * r[0] 20 | for i in range(1, p): 21 | g = (r[i+1] - np.dot(a, r[1:i+1])) / v 22 | a = np.r_[ g, a - g * a[i-1::-1] ] 23 | v *= 1. - g*g 24 | # return the coefficients of the A(z) filter 25 | return np.r_[1, -a[::-1]] 26 | 27 | 28 | def lpc(x, p): 29 | # compute p LPC coefficients for a speech segment 30 | return ld(bac(x, p), p) 31 | 32 | 33 | """ 34 | C-"friendly" implementation 35 | """ 36 | def ld_eff(r, order): 37 | # solve the toeplitz system using the Levinson-Durbin algorithm 38 | a = np.ones(order+1) 39 | a_prev = np.ones(order) 40 | a[1] = r[1]/r[0] 41 | for p in range(2, order+1): 42 | 43 | for j in range(1, p): 44 | a_prev[j] = a[j] 45 | 46 | # TODO: compute `k` from `r` and `a` 47 | k = 1 48 | 49 | # TODO: compute new `a` with `a_prev` and `k` 50 | # separate vector is needed so we don't overwrite! 51 | for j in range(1, p): 52 | a[j] = a_prev[j] 53 | a[p] = k 54 | 55 | # by convention, have negative of coefficients 56 | for p in range(1, order+1): 57 | a[p] *= -1 58 | 59 | return a 60 | 61 | 62 | def lpc_eff(x, p): 63 | # compute p LPC coefficients for a speech segment 64 | return ld_eff(bac(x, p), p) 65 | -------------------------------------------------------------------------------- /scripts/linear_prediction/voiced.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/scripts/linear_prediction/voiced.wav -------------------------------------------------------------------------------- /scripts/linear_prediction/voiced_gran_synth.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/scripts/linear_prediction/voiced_gran_synth.wav -------------------------------------------------------------------------------- /scripts/linear_prediction/voiced_gran_synth_lpc.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCAV/dsp-labs/f966e46149d3a3a73ba020774ef11e0c815c7749/scripts/linear_prediction/voiced_gran_synth_lpc.wav --------------------------------------------------------------------------------