This week, we’ve worked on creating the FIR filter for converting the 1-bit 1-3MHz Pulse Density Modulation output of the microphone to a standard double precision array in MATLAB. Essentially, the FIR filter is a lowpass filter that only allows signals below 20kHz (human hearing range) to pass through.
We used MATLAB’s Filter Designer tool to generate a lowpass FIR filter with 1.000MHz sampling frequency, 20kHz passband, 25kHz stopband. The resulting FIR filter had 506 taps. I could have lowered the stop band at the expense of higher filter order, but I didn’t want to slow the system down too much during the actual filtering process. We will see if a sharper filter is needed. The FIR filter has the following frequency and phase response:
In order to apply the filter, we perform a convolution of the signal with the coefficients of the filter.
Original PDM signal, zoomed in:
Filtered result, zoomed in:
Great, we are getting our 850Hz tone that we applied to the mic back!
- The process of convolving the PDM signal with the FIR filter seems to take a few seconds in MATLAB. We will need to optimize this for a realistic processing time for all 96 microphones.
- I was not able to get the resulting signal’s audio to play in MATLAB. I do hear some pops and crackles though, so there must be a way to play a double array.
- In talks with Patrick from TDK Invensense for microphones. We may be able to source the microphones from them instead of Mouser or Digikey, saving us a lot of money.
This week I mainly worked on the design report, and debugging ethernet.
After CDR we had a few comments, one of which was concerning the choice of FPGA. Based on that, I went through and evaluated whether we should switch up to a newer/larger FPGA. I did some preliminary checks on the expected size of the final design, as was suggested during CDR. Since there is very little processing done on the FPGA, it is mostly just used for data acquisition, the required logic took around 30% of the space available, even with an intentionally inefficient PDM filter.
This used some stand-in logic for the microphone acquisition and filtering, but should take similar space to the final filter.
I also worked some with Ryan on the PDM microphones, we were able to get some very basic data off of a microphone (in this case, given an 820Hz sine wave):
One minor change to the plan is that we plan to buy the Numato PHY this coming week, as the GbE development is falling behind. Other than that, we are still on track. In the mean time, I will also begin using a simple USB 2.0 interface for the FPGA based on a teensy 4.0, as a stop-gap while working on GbE.
This week, I presented the Design Review Presentation. We focused on specifying the metrics and validation of our project. Many helpful feedbacks were given by the audience. After receiving peer review feedback, I personally learned how I presented in front of people. I realized that I lacked skills in speaking loudly and having eye contact with the audience. The feedback also included some specific comments about our design as well. We are looking forward to covering the feedbacks on including array geometry and simple frequency analysis for our design report. The comments were very helpful.
(output of analog to pdm with simple signal)
In addition, I created analog to pdm converter as shown above. The code can used for testing purposes. Furthermore, a basic pdm to pcm is coded with the help from Ryan. He found a nice library in MATLAB that had the necessary functions to do so. The plot can be seen in Ryan’s Saturday Report. Yet, we do have considerations that the current code is not efficient enough for 96 microphone array. Some more filtering should be done.
A potential solution is found to be using a CIC filter. CIC filters achieve both decimation and interpolation without using multipliers. We find this a good alternative to the current design of pdm to pcm.
In terms of the schedule, we are on track.
For next week, I look forward to starting coding in Python or Java since we are currently working on MATLAB codes and look for efficient manners of computing the pdm to pcm.
We’re continuing our investigation with implementing 1Gbps Ethernet with our FPGA. The Spartan 6 board does come with two Gigabit Ethernet ports, but since it’s not a development board (actually an LED array controller), the Broadcom transceiver does not have a public datasheet for it, so it’s hard to control, even though it’s using the industry-standard RGMII protocol.
Instead, we’re looking into an expansion board with the Realtek RTL8211E from Numato. It has very good documentation that should make implementation much easier:
The output of the PDM microphone is a 1-bit digital signal. Even if the output is 1-bit high quality audio can be transmitted due to the fact that oversampling is occurring. For example, refer to this diagram below (Wikipedia):
If we average (low pass filter) the PDM signal in blue, we’re able to recover the original analog signal. Implementing a low pass filter with discrete analog components is one way to recover the audio, but since we’re dealing with 96 microphones, we want the processing to be digital for greater flexibility and we don’t need ADCs as well.
If performance turns out to be an issue, we will look into more efficient low pass filter algorithms such as using cascaded integrated-comb filters.
As a quick sanity check, we were able to probe the output of the PDM microphone and apply the scope’s low pass filter to get the signal back: