From 0cbcd652a34bc7c54217cc38868858f829aca633 Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 8 Nov 2024 12:26:05 +0800 Subject: [PATCH] doc(lp_vad): lp vad programming guide --- .../include/driver/lp_i2s_vad.h | 10 +- .../include/ulp_lp_core_lp_vad_shared.h | 2 - .../diagrams/vad/vad_state_machine.png | Bin 0 -> 52656 bytes docs/conf_common.py | 6 + docs/doxygen/Doxyfile | 3 - docs/doxygen/Doxyfile_esp32p4 | 5 + docs/en/api-reference/peripherals/index.rst | 1 + docs/en/api-reference/peripherals/lp_i2s.rst | 19 +- docs/en/api-reference/peripherals/vad.rst | 181 ++++++++++++++++++ .../zh_CN/api-reference/peripherals/index.rst | 2 + .../api-reference/peripherals/lp_i2s.rst | 1 + docs/zh_CN/api-reference/peripherals/vad.rst | 1 + 12 files changed, 206 insertions(+), 25 deletions(-) create mode 100644 docs/_static/diagrams/vad/vad_state_machine.png create mode 100644 docs/en/api-reference/peripherals/vad.rst create mode 100644 docs/zh_CN/api-reference/peripherals/lp_i2s.rst create mode 100644 docs/zh_CN/api-reference/peripherals/vad.rst diff --git a/components/esp_driver_i2s/include/driver/lp_i2s_vad.h b/components/esp_driver_i2s/include/driver/lp_i2s_vad.h index ce52370cde..a11f19782b 100644 --- a/components/esp_driver_i2s/include/driver/lp_i2s_vad.h +++ b/components/esp_driver_i2s/include/driver/lp_i2s_vad.h @@ -78,8 +78,9 @@ typedef struct vad_unit_ctx_t *vad_unit_handle_t; typedef struct { int init_frame_num; /**< Number of init frames that are used for VAD to denoise, this helps the VAD to decrease the accidental trigger ratio. Note too big values may lead to voice activity miss */ - int min_energy_thresh; ///< Min energy threshold. - bool skip_band_energy_thresh; ///< Skip band energy threshold or not + int min_energy_thresh; ///< Minimum energy threshold, voice activities with energy higher than this value will be detected. + bool skip_band_energy_thresh; /**< Skip band energy threshold or not, the passband energy check determines whether the proportion of passband energy within the total frequency domain meets the required threshold. + Note in different environments, enabling the passband energy check may reduce false trigger rates but could also increase the rate of missed detections. */ int speak_activity_thresh; /**< When in speak-activity-listening-state, if number of the detected speak activity is higher than this value, VAD runs into speak-activity-detected-state */ @@ -93,6 +94,9 @@ typedef struct { int max_speak_activity_thresh; /**< When in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, VAD runs into speak-activity-listening-state */ } lp_vad_config_t; +/** + * @brief LP VAD Init Configurations + */ typedef struct { lp_i2s_chan_handle_t lp_i2s_chan; ///< LP I2S channel handle lp_vad_config_t vad_config; ///< LP VAD config @@ -115,7 +119,6 @@ esp_err_t lp_i2s_vad_new_unit(lp_vad_t vad_id, const lp_vad_init_config_t *init_ * @brief Enable LP VAD * * @param[in] unit VAD handle - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success @@ -128,7 +131,6 @@ esp_err_t lp_i2s_vad_enable(vad_unit_handle_t unit); * @brief Disable LP VAD * * @param[in] unit VAD handle - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success diff --git a/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h b/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h index 8a37dee54d..979398eab6 100644 --- a/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h +++ b/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h @@ -82,7 +82,6 @@ esp_err_t lp_core_lp_vad_init(lp_vad_t vad_id, const lp_core_lp_vad_cfg_t *init_ * @brief Enable LP VAD * * @param[in] vad_id VAD ID - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success @@ -95,7 +94,6 @@ esp_err_t lp_core_lp_vad_enable(lp_vad_t vad_id); * @brief Disable LP VAD * * @param[in] vad_id VAD ID - * @param[in] init_config Initial configurations * * @return * - ESP_OK: On success diff --git a/docs/_static/diagrams/vad/vad_state_machine.png b/docs/_static/diagrams/vad/vad_state_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..7677ec07a4d98558176f36ed5eebf98c8a57fd21 GIT binary patch literal 52656 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 bY>$x!{_3IFo5&G>^C7B=nhHgCEua1e_O2ue literal 0 HcmV?d00001 diff --git a/docs/conf_common.py b/docs/conf_common.py index e8d75279a7..01c9a0e338 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -174,6 +174,10 @@ SPI_DOCS = ['api-reference/peripherals/spi_master.rst', I2S_DOCS = ['api-reference/peripherals/i2s.rst'] +VAD_DOCS = ['api-reference/peripherals/vad.rst'] + +LP_I2S_DOCS = ['api-reference/peripherals/lp_i2s.rst'] + ISP_DOCS = ['api-reference/peripherals/isp.rst'] DSLP_STUB_DOCS = ['api-guides/deep-sleep-stub.rst'] @@ -286,6 +290,8 @@ conditional_include_dict = {'SOC_BT_SUPPORTED':BT_DOCS, 'SOC_I2C_SUPPORTED':I2C_DOCS, 'SOC_GPSPI_SUPPORTED':SPI_DOCS, 'SOC_I2S_SUPPORTED':I2S_DOCS, + 'SOC_LP_I2S_SUPPORTED':LP_I2S_DOCS, + 'SOC_LP_VAD_SUPPORTED':VAD_DOCS, 'SOC_ISP_SUPPORTED':ISP_DOCS, 'ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB': DSLP_STUB_DOCS, 'SOC_ADC_SUPPORTED':ADC_DOCS, diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile index 2b434480b5..44f44b8810 100644 --- a/docs/doxygen/Doxyfile +++ b/docs/doxygen/Doxyfile @@ -126,9 +126,6 @@ INPUT = \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_pdm.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_std.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_tdm.h \ - $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s.h \ - $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_std.h \ - $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_pdm.h \ $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/i2s_types.h \ $(PROJECT_PATH)/components/esp_driver_pcnt/include/driver/pulse_cnt.h \ $(PROJECT_PATH)/components/esp_driver_rmt/include/driver/rmt_common.h \ diff --git a/docs/doxygen/Doxyfile_esp32p4 b/docs/doxygen/Doxyfile_esp32p4 index ebdf3a5619..66146f1ed7 100644 --- a/docs/doxygen/Doxyfile_esp32p4 +++ b/docs/doxygen/Doxyfile_esp32p4 @@ -11,6 +11,7 @@ INPUT += \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_utils.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_interrupts.h \ $(PROJECT_PATH)/components/ulp/lp_core/lp_core/include/ulp_lp_core_spi.h \ + $(PROJECT_PATH)/components/ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h \ $(PROJECT_PATH)/components/ulp/ulp_common/include/ulp_common.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_helpers.h \ $(PROJECT_PATH)/components/usb/include/usb/usb_host.h \ @@ -41,6 +42,10 @@ INPUT += \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_gamma.h \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_hist.h \ $(PROJECT_PATH)/components/esp_driver_isp/include/driver/isp_color.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_std.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_pdm.h \ + $(PROJECT_PATH)/components/esp_driver_i2s/include/driver/lp_i2s_vad.h \ $(PROJECT_PATH)/components/esp_driver_jpeg/include/driver/jpeg_decode.h \ $(PROJECT_PATH)/components/esp_driver_jpeg/include/driver/jpeg_encode.h \ $(PROJECT_PATH)/components/esp_driver_ppa/include/driver/ppa.h \ diff --git a/docs/en/api-reference/peripherals/index.rst b/docs/en/api-reference/peripherals/index.rst index b5ed610f6f..22eaa6e2e3 100644 --- a/docs/en/api-reference/peripherals/index.rst +++ b/docs/en/api-reference/peripherals/index.rst @@ -42,6 +42,7 @@ Peripherals API :SOC_GPSPI_SUPPORTED: spi_slave :SOC_SPI_SUPPORT_SLAVE_HD_VER2: spi_slave_hd :SOC_LP_I2S_SUPPORTED: lp_i2s + :SOC_LP_VAD_SUPPORTED: vad :SOC_TEMP_SENSOR_SUPPORTED: temp_sensor :esp32: touch_pad :SOC_TOUCH_SENSOR_SUPPORTED and not esp32: cap_touch_sens diff --git a/docs/en/api-reference/peripherals/lp_i2s.rst b/docs/en/api-reference/peripherals/lp_i2s.rst index 04cd3c9c09..4d928d62df 100644 --- a/docs/en/api-reference/peripherals/lp_i2s.rst +++ b/docs/en/api-reference/peripherals/lp_i2s.rst @@ -24,7 +24,7 @@ A basic I2S data bus has one master and one slave. The roles remain unchanged th LP I2S on {IDF_TARGET_NAME} only supports working as an I2S Slave. -The LP I2S module on {IDF_TARGET_NAME} provides an independent RX unit, which supports receiving data when the chip is running with the lowest power consumption. Compared to HP I2S, LP I2S does not support DMA access. Instead, it uses a piece of separate internal memory to store data. +The LP I2S module on {IDF_TARGET_NAME} provides an independent RX unit, which supports receiving data when the chip is running under sleep modes. Compared to HP I2S, LP I2S does not support DMA access. Instead, it uses a piece of separate internal memory to store data. I2S Communication Mode @@ -33,24 +33,12 @@ I2S Communication Mode Standard Mode ^^^^^^^^^^^^^ -In standard mode, there are always two sound channels, i.e., the left and right channels, which are called "slots". These slots support 16-bit-width sample data. The communication format for the slots mainly includes the following: - -- **Philips Format**: Data signal has one-bit shift comparing to the WS signal, and the duty of WS signal is 50%. - -.. wavedrom:: /../_static/diagrams/i2s/std_philips.json - -- **MSB Format**: Basically the same as Philips format, but without data shift. - -.. wavedrom:: /../_static/diagrams/i2s/std_msb.json - -- **PCM Short Format**: Data has one-bit shift and meanwhile the WS signal becomes a pulse lasting for one BCLK cycle. - -.. wavedrom:: /../_static/diagrams/i2s/std_pcm.json +In standard mode, there are always two sound channels, i.e., the left and right channels, which are called "slots". These slots support 16-bit-width sample data. The communication format for the slots can be found in this :ref:`i2s-communication-mode` section. PDM Mode (RX) ^^^^^^^^^^^^^ -PDM (Pulse-density Modulation) mode for RX channel can receive PDM-format data. Only 16-bit-width sample data are supported. +PDM (Pulse-density Modulation) mode for RX channel can receive PDM-format data. Only 16-bit-width sample data are supported. The communication format for the slots can be found in this :ref:`i2s-communication-mode` section. Functional Overview @@ -144,4 +132,3 @@ API Reference .. include-build-file:: inc/lp_i2s.inc .. include-build-file:: inc/lp_i2s_std.inc .. include-build-file:: inc/lp_i2s_pdm.inc -.. include-build-file:: inc/components/esp_driver_i2s/include/driver/i2s_types.inc diff --git a/docs/en/api-reference/peripherals/vad.rst b/docs/en/api-reference/peripherals/vad.rst new file mode 100644 index 0000000000..73827b45df --- /dev/null +++ b/docs/en/api-reference/peripherals/vad.rst @@ -0,0 +1,181 @@ +Voice Activity Detection (VAD) +============================== + +:link_to_translation:`zh_CN:[中文]` + + +Introduction +------------ + +Voice Activity Detection (VAD) module facilitates the hardware implementation of the first-stage algorithm for voice wake-up and other multimedia functions. + +Additionally, it provides hardware support for low-power voice wake-up solutions. + +.. only:: SOC_LP_I2S_SUPPORTED + + For LP I2S documentation, see :doc:`Low Power Inter-IC Sound <./lp_i2s>`. + + +Hardware State Machine +---------------------- + +LP VAD driver provides a structure :cpp:type:`lp_vad_config_t` to configure the LP VAD module: + +- :cpp:member:`lp_vad_config_t::init_frame_num`, number of init frames that are used for VAD to denoise, this helps the VAD to decrease the accidental trigger ratio. Note too big values may lead to voice activity miss. +- :cpp:member:`lp_vad_config_t::min_energy_thresh`, minimum energy threshold, voice activities with energy higher than this value will be detected. +- :cpp:member:`lp_vad_config_t::skip_band_energy_thresh`, skip band energy threshold or not, the passband energy check determines whether the proportion of passband energy within the total frequency domain meets the required threshold. Note in different environments, enabling the passband energy check may reduce false trigger rates but could also increase the rate of missed detections. +- :cpp:member:`lp_vad_config_t::speak_activity_thresh`, when in speak-activity-listening-state, if number of the detected speak activity is higher than this value, VAD runs into speak-activity-detected-state. +- :cpp:member:`lp_vad_config_t::non_speak_activity_thresh`, when in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, but lower than :cpp:member:`lp_vad_config_t::max_speak_activity_thresh`, + * if the number of the detected non-speak activity is higher than this value, VAD runs into speak-activity-listening-state + * if the number of the detected non-speak activity is lower than this value, VAD keeps in speak-activity-detected-state +- :cpp:member:`lp_vad_config_t::min_speak_activity_thresh`, when in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, but lower than :cpp:member:`lp_vad_config_t::max_speak_activity_thresh`, then the VAD state machine will depends on the value of :cpp:member:`lp_vad_config_t::non_speak_activity_thresh` +- :cpp:member:`lp_vad_config_t::max_speak_activity_thresh`, when in speak-activity-detected-state, if the number of the detected speak activity is higher than this value, VAD runs into speak-activity-listening-state + +Above configurations can change the VAD state machine shown below: + +.. code-block:: text + + ┌──────────────────────────────────┐ + │ │ + ┌─────────────┤ speak-activity-listening-state │ ◄───────────────┐ + │ │ │ │ + │ └──────────────────────────────────┘ │ + │ ▲ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + detected speak activity │ │ detected speak activity │ detected speak activity + >= │ │ >= │ >= + 'speak_activity_thresh' │ │ 'min_speak_activity_thresh' │ 'max_speak_activity_thresh' + │ │ │ + │ │ && │ + │ │ │ + │ │ detected non-speak activity │ + │ │ < │ + │ │ 'non_speak_activity_thresh' │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ ┌───────────┴─────────────────────┐ │ + │ │ │ │ + └───────────► │ speak-activity-detected-state ├─────────────────┘ + │ │ + └─┬───────────────────────────────┘ + │ + │ ▲ + │ │ + │ │ + │ │ detected speak activity + │ │ >= + │ │ 'min_speak_activity_thresh' + │ │ + │ │ && + │ │ + │ │ detected non-speak activity + │ │ < + └─────────────────────┘ 'non_speak_activity_thresh' + + +HP Driver Functional Overview +----------------------------- + +The VAD HP driver is used for configure the LP VAD to be working under the control of the HP core. The HP core can also be woken up by the VAD when voice activity is detected. + +Resource Allocation +^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:type:`lp_vad_init_config_t` is the configuration structure that is needed to create a LP I2S VAD unit handle. To create a LP I2S VAD unit handle, you will need to first create a LP I2S channel handle. see :doc:`Low Power Inter-IC Sound <./lp_i2s>`. + + You can call :cpp:func:`lp_i2s_vad_new_unit` to create the handle. If the VAD unit is no longer used, you should recycle the allocated resource by calling :cpp:func:`lp_i2s_vad_del_unit`. + + .. code:: c + + vad_unit_handle_t vad_handle = NULL; + lp_vad_init_config_t init_config = { + .lp_i2s_chan = rx_handle, + .vad_config = { + .init_frame_num = 100, + .min_energy_thresh = 100, + .speak_activity_thresh = 10, + .non_speak_activity_thresh = 30, + .min_speak_activity_thresh = 3, + .max_speak_activity_thresh = 100, + }, + }; + ESP_ERROR_CHECK(lp_i2s_vad_new_unit(vad_id, init_config, &vad_handle)); + + ESP_ERROR_CHECK(lp_i2s_vad_del_unit(vad_handle)); + +Enable and Disable the VAD +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + Before using a VAD unit to detect voice activity, you need to enable the VAD unit by calling :cpp:func:`lp_i2s_vad_enable`, this function switches the driver state from **init** to **enable**, and also enables the VAD hardware. Calling :cpp:func:`lp_i2s_vad_disable` does the opposite, that is, put the driver back to the **init** state, the hardware will stop as well. + +HP Core Wake-up +^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:func:`esp_sleep_enable_vad_wakeup` can help you to set the VAD to be working as the HP core wake-up source. To make VAD work during sleep, you should let the system maintain the RTC domain and XTAL power. See code example below: + + .. code:: c + + ESP_ERROR_CHECK(esp_sleep_enable_vad_wakeup()); + + +LP Driver Functional Overview +----------------------------- + +The VAD LP driver is mainly for LP core wake-up. The VAD can be configured under HP core control, then it can wakeup the LP core when voice activities are detected. + +Resource Allocation +^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:type:`lp_core_lp_vad_cfg_t` and :cpp:func:`lp_core_lp_vad_init` are used to initialize the VAD LP driver. + + :cpp:func:`lp_core_lp_vad_deinit` is used to recycle the allocated resources. + +Enable and Disable the VAD +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + :cpp:func:`lp_core_lp_vad_enable` and :cpp:func:`lp_core_lp_vad_disable` are used for enabling / disabling the hardware. + +LP Core Wake-up +^^^^^^^^^^^^^^^ + +.. only:: SOC_LP_I2S_SUPPORT_VAD + + Set :c:macro:`ULP_LP_CORE_WAKEUP_SOURCE_LP_VAD` in :cpp:type:`ulp_lp_core_cfg_t` to enable the VAD to be working as the LP core wake-up source. + + .. code:: c + + static void load_and_start_lp_core_firmware(ulp_lp_core_cfg_t* cfg, const uint8_t* firmware_start, const uint8_t* firmware_end) + { + TEST_ASSERT(ulp_lp_core_load_binary(firmware_start, + (firmware_end - firmware_start)) == ESP_OK); + + TEST_ASSERT(ulp_lp_core_run(cfg) == ESP_OK); + } + + ulp_lp_core_cfg_t cfg = { + .wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_LP_VAD, + }; + load_and_start_lp_core_firmware(&cfg, lp_core_main_vad_bin_start, lp_core_main_vad_bin_end); + + +API Reference +------------- + +.. include-build-file:: inc/lp_i2s_vad.inc +.. include-build-file:: inc/ulp_lp_core_lp_vad_shared.inc diff --git a/docs/zh_CN/api-reference/peripherals/index.rst b/docs/zh_CN/api-reference/peripherals/index.rst index bc60f6a489..ba34da6bf5 100644 --- a/docs/zh_CN/api-reference/peripherals/index.rst +++ b/docs/zh_CN/api-reference/peripherals/index.rst @@ -40,6 +40,8 @@ :SOC_GPSPI_SUPPORTED: spi_master :SOC_GPSPI_SUPPORTED: spi_slave :SOC_SPI_SUPPORT_SLAVE_HD_VER2: spi_slave_hd + :SOC_LP_I2S_SUPPORTED: lp_i2s + :SOC_LP_VAD_SUPPORTED: vad :SOC_JPEG_CODEC_SUPPORTED: jpeg :SOC_TEMP_SENSOR_SUPPORTED: temp_sensor :esp32: touch_pad diff --git a/docs/zh_CN/api-reference/peripherals/lp_i2s.rst b/docs/zh_CN/api-reference/peripherals/lp_i2s.rst new file mode 100644 index 0000000000..7bb773ad78 --- /dev/null +++ b/docs/zh_CN/api-reference/peripherals/lp_i2s.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/peripherals/lp_i2s.rst diff --git a/docs/zh_CN/api-reference/peripherals/vad.rst b/docs/zh_CN/api-reference/peripherals/vad.rst new file mode 100644 index 0000000000..bd87f08f81 --- /dev/null +++ b/docs/zh_CN/api-reference/peripherals/vad.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/peripherals/vad.rst