# Getting started with CMSIS-DSP using Python

## In this learning path

- [Introduction](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/)
- [CMSIS-DSP Python package](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-1/)
- [Set up environment](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-2/)
- [Load an audio file](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-3/)
- [Write a simple VAD](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-4/)
- [Write a noise suppression algorithm](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-5/)
- [Write the CMSIS-DSP Q15 implementation](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-6/)
- [Convert the CMSIS-DSP Python to C](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-7/)
- [Develop your knowledge](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-8/)
- [Next Steps](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/_next-steps/)

## About this Learning Path

| Skill level:  | Advanced              |
|---------------|-----------------------|
| Reading time: | 45 min                |
| Last updated: | 08 Jul 2026           |

| Author:                     | Christophe Favergeon                       |
|-----------------------------|-------------------------------------------|
| Arm IP:                     | [Cortex-M](https://support.arm.com/?tab=compute-ip&Product%20Type=Microcontrollers) [Cortex-A](https://support.arm.com/?tab=compute-ip&Product%20Type=Application%20Processors) |
| Tags:                       | [Libraries](https://learn.arm.com/tag/libraries) [Linux](https://learn.arm.com/tag/linux) [Windows](https://learn.arm.com/tag/windows) [macOS](https://learn.arm.com/tag/macos) [CMSIS-DSP](https://learn.arm.com/tag/cmsis-dsp) [Python](https://learn.arm.com/tag/python) [C](https://learn.arm.com/tag/c) [Jupyter Notebook](https://learn.arm.com/tag/jupyter-notebook) [NumPy](https://learn.arm.com/tag/numpy) |

### Who is this for?

This is an advanced topic for developers looking to integrate the CMSIS-DSP library into their applications using Python.

### What will you learn?

Upon completion of this Learning Path, you will be able to:

- Use the CMSIS-DSP Python package to prototype DSP algorithms.
- Understand how the Python API maps to the C implementation.
- Build and port a complex DSP application using CMSIS-DSP.

### Prerequisites

Before starting, you will need the following:

- Familiarity with Python and digital signal processing concepts.
- Working knowledge of C.
- Prior exposure to CMSIS-DSP.
- Python installed on your machine.

### Summary

You’ll prototype a DSP pipeline in Python with the `cmsisdsp` package, then relate those steps to CMSIS-DSP C for embedded targets. First, you’ll set up a Python environment and Jupyter notebook, load a sample “yes/no” audio clip with background noise, and implement a simple energy-based voice activity detector with a tunable threshold. Then, you’ll develop a noise-suppression routine using overlapping frames and a Hanning window generated by the CMSIS-DSP Python API, alongside a `NumPy` reference. You’ll validate the approach by listening to processed audio and inspecting plots, then map Python calls to equivalent C functions for Cortex-M and Cortex-A implementations.

### Frequently asked questions

<details>
<summary>How do I know the CMSIS-DSP Python package installed correctly?</summary>
In your activated environment, start Python and import `cmsisdsp` as `dsp` and `numpy`. Call `dsp.arm_hanning_f32` on a small window length and confirm it returns an array without errors.
</details>

<details>
<summary>I ran the cell that creates the audio widget but nothing appears — what should I check?</summary>
Confirm the notebook kernel is running and that the Audio object is the last expression in the cell so Jupyter displays it. Rerun the cells that define filedata and the Audio widget, then check the cell output.
</details>

<details>
<summary>How should I choose the VAD energy threshold?</summary>
Start with a moderate value, then iterate by listening to the result. Aim to remove noise between words without clipping spoken segments. Adjust the threshold and rerun until the segmentation matches what you expect.
</details>

<details>
<summary>How do I verify that overlapping windows and the Hanning window are applied correctly?</summary>
Plot the Hanning window as shown and check that it tapers near zero at both ends. Inspect frame indices to confirm overlap and listen for smooth transitions without clicks at frame boundaries.
</details>

<details>
<summary>What result should I expect after running the noise suppression steps?</summary>
Playback should have reduced background noise during pauses while keeping the “yes” and “no” utterances clear. If speech sounds distorted or noise persists, revisit the VAD threshold and window length.
</details>
