Inspiration

This project was inspired by the DSP tutorials from the LCAV lab found here: https://lcav.gitbook.io/dsp-labs/. The gitbook walks the user through a tutorial using the Nucleo STM32 board to process real-time signals recieved by a mircophone with different pitch effects.

What it does

There are three different types of real-time voice effects found in this project. One, known as the robot effect takes the signal and modulates it with a sinusoidal function causing an upward shift in pitch. The second is known as a granular synthesis pitch shifter which takes a signal and increases or decreases its pitch by subsampling or upsampling it in window intervals. The final effect was acheived by performing the discrete time fourier transform on intervals of the signal and shifting the frequencies before transforming back to the time domain.

How I built it

The first robot voice effect was implemented on the Nucleo STM32 in C as well as in python on my laptop. The granular synthesis and DFT were both implemented using real-time techniques but only in python. The DFT also includes a tutorial like format with theory and then a partial implemenation of the DFT designed to have the tutorial follower fill in the blanks.

Challenges I ran into

There were numerous challenges with the Nucleo STM32 board. One was that when selecting the defined "left" and "right" microphones according to the mircophone data sheet did not lead to consistent results when filling up the data in buffer, but only for the alien example. As for the design implementation the robot and granular synthesis were easier as the tutorials helped walking through the implementation but the DFT real time implementation was more of a challenge but after seeing how to use windows with the granular technique it wasn't too bad.

What I learned

I learned a lot about the Nucleo STM32 and a lot of useful tricks for processing in real time. This includes how to utilise a timer to see if the process can in fact be executed within buffer and transfer frequency constraints, utilizing integer instead of floating variables and optimizing the arithmetic for the highest precision with integers. Storing variables to be utilized later and implementing buffers.

Built With

Share this project:

Updates