├── .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 | 
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 | 
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 | 
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 | 
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 | 
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 | 
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 | 
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 | 
27 |
28 | And then you can proceed to deleting the old file and creating a new session.
29 |
30 | 
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 | 
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 | 
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 | 
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
--------------------------------------------------------------------------------