In this project, you will learn about Audio and Pulse Density Modulation (PDM). Then you will create an IP Core for this system and drive it through the Xilinx SDK.
Refer to background information for material that will help you go through this project.
1. Create a PDM to PCM Converter
Setup a PDM to PCM converter based on the background material and use your Sigma Delta Modulator together with the FIFO from your previous project to play the microphone data. You may reconfigure the sigma delta modulator as necessary.
2. Create a
my_MIC IP should have an enable MIC functionality. Your code should be able to record audio from the MIC for at least 4 seconds. Thus, at 8kHz sample rate and 8 bit data you should be able to store 4 seconds worth of data in a block RAM. Make sure the block RAM is configured as two-way since you need write into it and then read the data for playback. Your register map for the IP should look as follows:
|0x4BB03000||Enable_MIC||0:0||Enable HPH out Left (Bit 0) and Right (Bit 1)|
|0x4BB03004||Start Recording||0:0||Record for 4 seconds|
|0x4BB03008||Start Playback||0:0||Play recorded audio|
3. Increase Sample Rate
Increase the sample rate of the PDM to 44kHz by taking 4 samples in the time period you had earlier. For example, if you sent out one sample every 256 PDM signals earlier, then now you can modify the code so that you send out one sample (8bits) every 64 PDM signals (or at 44kHz). You should be able to notice a significant difference in the sound quality.
4. Store Recorded data in DDR Memory
Find a way to transfer your recorded data directly to the DDR Memory. You can use addresses 0x00900000 and above confidently to store over 30 seconds of data.
1. Create an SDK Terminal Application to control your
Create an SDK Terminal Application using UART1 that is able to:
- Turn on/off Left Speaker
- Turn on/off Right Speaker
- Start Recording
- Start/Stop the Playback
2. Filter Recorded Data using a Simple Low Pass Filter in C
Use the data that you stored in DDR memory and filter it with a simple Low Pass Filter before playing it back. You can use the formula below to accomplish this.
filtered_output = (a) * (previous_filtered_output) + (1-a) * (raw_data)