Library to handle the X-NUCLEO-CCA02M1 MEMS Microphones Expansion Board.

Dependencies:   ST_I2S ST_FREQUENCY_DIVIDER USBDEVICE

Dependents:   HelloWorld_CCA02M1 HelloWorld_CCA02M1_mbedOS HelloWorld_CCA02M1 Karaoke_CCA01M1_CCA02M1_mbedOS

Fork of X_NUCLEO_CCA02M1 by ST Expansion SW Team

MEMS Microphones Library

Library to handle the X-NUCLEO-CCA02M1 MEMS Microphones Expansion Board. A single board allows to record a standard 2-channel stereo signal as an array of PCM samples (16 bit/sample); in principle, it could make use of six additional MEMS microphones to realize a 8-channel audio system.


Microphones configuration

Currently the configurations supported are the following:

  • Stereo@48KHz
  • Stereo@44.1KHz (CD audio quality)
  • Stereo@32KHz
  • Stereo@16KHz
  • Stereo@8KHz
  • Mono@48KHz
  • Mono@44.1KHz
  • Mono@32KHz
  • Mono@16KHz
  • Mono@8KHz

Mono configurations need a Jumper connecting PB_5 and PB_13 on the Morpho connector to properly work.


Platform compatibility

  • This board can be currently used with the Nucleo F4 Family only, please see the ST_I2S library compatibility for further information.
  • The library is compatible both with mbed OS 5.x and mbed classic 2.x (to work with mbed classic, the main application has to import the "events" library, which is not included into the "mbed" library).


I2S Peripheral Usage

By default this board makes use of the I2S peripheral available on Nucleo boards.


Acquiring through the USB

In order to acquire the recorded PCM audio channel with an audio SW on a PC, please connect the expansion board to a USB port of the PC, and the Nucleo board to a USB power supply.

Committer:
Davidroid
Date:
Wed Dec 12 15:44:02 2018 +0000
Revision:
26:53f8b511f2a1
Parent:
20:9952bef19da1
Update LICENSE.txt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davide.aliprandi@st.com 2:9f389fd8fb2e 1 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 2 ******************************************************************************
davide.aliprandi@st.com 2:9f389fd8fb2e 3 * @file PDM2PCMAudio.h
davide.aliprandi@st.com 2:9f389fd8fb2e 4 * @author AST / Software Platforms and Cloud
davide.aliprandi@st.com 2:9f389fd8fb2e 5 * @version V1.0
davide.aliprandi@st.com 2:9f389fd8fb2e 6 * @date November 10th, 2016
davide.aliprandi@st.com 2:9f389fd8fb2e 7 * @brief Class header file for the PDM2PCMAudio conversion library.
davide.aliprandi@st.com 2:9f389fd8fb2e 8 ******************************************************************************
davide.aliprandi@st.com 2:9f389fd8fb2e 9 * @attention
davide.aliprandi@st.com 2:9f389fd8fb2e 10 *
davide.aliprandi@st.com 2:9f389fd8fb2e 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
davide.aliprandi@st.com 2:9f389fd8fb2e 12 *
davide.aliprandi@st.com 2:9f389fd8fb2e 13 * Redistribution and use in source and binary forms, with or without modification,
davide.aliprandi@st.com 2:9f389fd8fb2e 14 * are permitted provided that the following conditions are met:
davide.aliprandi@st.com 2:9f389fd8fb2e 15 * 1. Redistributions of source code must retain the above copyright notice,
davide.aliprandi@st.com 2:9f389fd8fb2e 16 * this list of conditions and the following disclaimer.
davide.aliprandi@st.com 2:9f389fd8fb2e 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
davide.aliprandi@st.com 2:9f389fd8fb2e 18 * this list of conditions and the following disclaimer in the documentation
davide.aliprandi@st.com 2:9f389fd8fb2e 19 * and/or other materials provided with the distribution.
davide.aliprandi@st.com 2:9f389fd8fb2e 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
davide.aliprandi@st.com 2:9f389fd8fb2e 21 * may be used to endorse or promote products derived from this software
davide.aliprandi@st.com 2:9f389fd8fb2e 22 * without specific prior written permission.
davide.aliprandi@st.com 2:9f389fd8fb2e 23 *
davide.aliprandi@st.com 2:9f389fd8fb2e 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
davide.aliprandi@st.com 2:9f389fd8fb2e 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
davide.aliprandi@st.com 2:9f389fd8fb2e 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
davide.aliprandi@st.com 2:9f389fd8fb2e 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
davide.aliprandi@st.com 2:9f389fd8fb2e 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
davide.aliprandi@st.com 2:9f389fd8fb2e 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
davide.aliprandi@st.com 2:9f389fd8fb2e 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
davide.aliprandi@st.com 2:9f389fd8fb2e 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
davide.aliprandi@st.com 2:9f389fd8fb2e 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
davide.aliprandi@st.com 2:9f389fd8fb2e 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
davide.aliprandi@st.com 2:9f389fd8fb2e 34 *
davide.aliprandi@st.com 2:9f389fd8fb2e 35 ******************************************************************************
davide.aliprandi@st.com 2:9f389fd8fb2e 36 */
davide.aliprandi@st.com 2:9f389fd8fb2e 37
davide.aliprandi@st.com 2:9f389fd8fb2e 38
davide.aliprandi@st.com 2:9f389fd8fb2e 39 /* Define to prevent recursive inclusion -------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 40
davide.aliprandi@st.com 2:9f389fd8fb2e 41 #ifndef __PDM2PCM_AUDIO_CLASS_H
davide.aliprandi@st.com 2:9f389fd8fb2e 42 #define __PDM2PCM_AUDIO_CLASS_H
davide.aliprandi@st.com 2:9f389fd8fb2e 43
davide.aliprandi@st.com 2:9f389fd8fb2e 44
Davidroid 17:a758b376b018 45 /* Configuration -------------------------------------------------------------*/
Davidroid 17:a758b376b018 46
Davidroid 17:a758b376b018 47 /**
Davidroid 17:a758b376b018 48 * Enable to use the OpenPDM2PCM library.
Davidroid 17:a758b376b018 49 */
Davidroid 17:a758b376b018 50 #define USE_OPEN_PDM2PCM_LIBRARY
Davidroid 17:a758b376b018 51
Davidroid 17:a758b376b018 52 /**
Davidroid 17:a758b376b018 53 * Enable to debug the duration of the PDM2PCM library functions through an
Davidroid 17:a758b376b018 54 * oscilloscope.
Davidroid 17:a758b376b018 55 */
Davidroid 17:a758b376b018 56 //#define PDM2PCM_AUDIO_DEBUG
Davidroid 17:a758b376b018 57
Davidroid 17:a758b376b018 58
davide.aliprandi@st.com 2:9f389fd8fb2e 59 /* Includes ------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 60
davide.aliprandi@st.com 2:9f389fd8fb2e 61 #include "mbed.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 62 #include "component_def.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 63 #ifdef USE_OPEN_PDM2PCM_LIBRARY
davide.aliprandi@st.com 2:9f389fd8fb2e 64 #include "OpenPDMFilter.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 65 #else
davide.aliprandi@st.com 2:9f389fd8fb2e 66 #include "pdm_filter.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 67 #endif
davide.aliprandi@st.com 2:9f389fd8fb2e 68
davide.aliprandi@st.com 2:9f389fd8fb2e 69
davide.aliprandi@st.com 2:9f389fd8fb2e 70 /* Definitions ---------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 71
Davidroid 20:9952bef19da1 72 #define DEMUX_FILTER_SIZE 128
Davidroid 20:9952bef19da1 73 #define DEMUX_FILTER_MASK 0x55
Davidroid 20:9952bef19da1 74 #define PDM2PCM_FILTER_SIZE 4
Davidroid 20:9952bef19da1 75 #define PDM2PCM_NOGAIN_VOLUME 4
Davidroid 20:9952bef19da1 76 #define PDM2PCM_MAX_VOLUME 64
davide.aliprandi@st.com 2:9f389fd8fb2e 77
davide.aliprandi@st.com 2:9f389fd8fb2e 78
davide.aliprandi@st.com 2:9f389fd8fb2e 79 /* Classes -------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 80
davide.aliprandi@st.com 2:9f389fd8fb2e 81 /** PDM2PCMAudio Conversion Library Class.
davide.aliprandi@st.com 2:9f389fd8fb2e 82 */
davide.aliprandi@st.com 2:9f389fd8fb2e 83 class PDM2PCMAudio
davide.aliprandi@st.com 2:9f389fd8fb2e 84 {
davide.aliprandi@st.com 2:9f389fd8fb2e 85 public:
davide.aliprandi@st.com 2:9f389fd8fb2e 86
davide.aliprandi@st.com 2:9f389fd8fb2e 87 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 88 * @brief Constructor.
davide.aliprandi@st.com 2:9f389fd8fb2e 89 * @param frequency Audio sampling frequency.
davide.aliprandi@st.com 2:9f389fd8fb2e 90 * @param channels Number of audio channels to be recorded.
davide.aliprandi@st.com 2:9f389fd8fb2e 91 */
davide.aliprandi@st.com 2:9f389fd8fb2e 92 PDM2PCMAudio(uint32_t frequency, uint32_t channels) :
davide.aliprandi@st.com 2:9f389fd8fb2e 93 _frequency(frequency),
davide.aliprandi@st.com 2:9f389fd8fb2e 94 _channels(channels)
davide.aliprandi@st.com 2:9f389fd8fb2e 95 #ifdef PDM2PCM_AUDIO_DEBUG
davide.aliprandi@st.com 2:9f389fd8fb2e 96 , _pdm2pcm_audio_signal(D9)
davide.aliprandi@st.com 2:9f389fd8fb2e 97 #endif
davide.aliprandi@st.com 2:9f389fd8fb2e 98 {
davide.aliprandi@st.com 2:9f389fd8fb2e 99 /* Enable CRC peripheral to unlock the PDM2PCMAudio library. */
davide.aliprandi@st.com 2:9f389fd8fb2e 100 __CRC_CLK_ENABLE();
davide.aliprandi@st.com 2:9f389fd8fb2e 101
Davidroid 20:9952bef19da1 102 /* Setting configuration. */
Davidroid 20:9952bef19da1 103 switch (_frequency)
Davidroid 20:9952bef19da1 104 {
Davidroid 20:9952bef19da1 105 case I2S_AUDIOFREQ_8K:
Davidroid 20:9952bef19da1 106 _decimation_factor = 128;
Davidroid 20:9952bef19da1 107 break;
Davidroid 20:9952bef19da1 108
Davidroid 20:9952bef19da1 109 case I2S_AUDIOFREQ_16K:
Davidroid 20:9952bef19da1 110 case I2S_AUDIOFREQ_32K:
Davidroid 20:9952bef19da1 111 case I2S_AUDIOFREQ_44K:
Davidroid 20:9952bef19da1 112 case I2S_AUDIOFREQ_48K:
Davidroid 20:9952bef19da1 113 default:
Davidroid 20:9952bef19da1 114 _decimation_factor = 64;
Davidroid 20:9952bef19da1 115 break;
Davidroid 20:9952bef19da1 116 }
Davidroid 20:9952bef19da1 117
davide.aliprandi@st.com 2:9f389fd8fb2e 118 /* Initializing PDM2PCMAudio Filter. */
davide.aliprandi@st.com 2:9f389fd8fb2e 119 for (uint32_t i = 0; i < _channels; i++)
davide.aliprandi@st.com 2:9f389fd8fb2e 120 {
davide.aliprandi@st.com 2:9f389fd8fb2e 121 /* Filter LP and HP Init */
davide.aliprandi@st.com 2:9f389fd8fb2e 122 _PDM2PCM_filter[i].LP_HZ = _frequency / 2;
davide.aliprandi@st.com 2:9f389fd8fb2e 123 _PDM2PCM_filter[i].HP_HZ = 10;
davide.aliprandi@st.com 2:9f389fd8fb2e 124 _PDM2PCM_filter[i].Fs = _frequency;
davide.aliprandi@st.com 2:9f389fd8fb2e 125 _PDM2PCM_filter[i].Out_MicChannels = _channels;
davide.aliprandi@st.com 2:9f389fd8fb2e 126 _PDM2PCM_filter[i].In_MicChannels = _channels;
Davidroid 20:9952bef19da1 127 _PDM2PCM_filter[i].Decimation = _decimation_factor;
Davidroid 20:9952bef19da1 128 _PDM2PCM_filter[i].MaxVolume = PDM2PCM_MAX_VOLUME;
davide.aliprandi@st.com 16:4ab2eac7be21 129 #ifdef USE_OPEN_PDM2PCM_LIBRARY
davide.aliprandi@st.com 2:9f389fd8fb2e 130 Open_PDM_Filter_Init((TPDMFilter_InitStruct *) &_PDM2PCM_filter[i]);
davide.aliprandi@st.com 2:9f389fd8fb2e 131 #else
davide.aliprandi@st.com 2:9f389fd8fb2e 132 PDM_Filter_Init((PDMFilter_InitStruct *) &_PDM2PCM_filter[i]);
davide.aliprandi@st.com 2:9f389fd8fb2e 133 #endif
davide.aliprandi@st.com 2:9f389fd8fb2e 134 }
davide.aliprandi@st.com 2:9f389fd8fb2e 135 };
davide.aliprandi@st.com 2:9f389fd8fb2e 136
davide.aliprandi@st.com 2:9f389fd8fb2e 137 /**
Davidroid 20:9952bef19da1 138 * @brief Getting number of PCM samples from nummber of PDM samples.
Davidroid 20:9952bef19da1 139 * @param PCM_samples Number of PCM samples.
Davidroid 20:9952bef19da1 140 * @retval Number of equivalent PDM samples.
Davidroid 20:9952bef19da1 141 */
Davidroid 20:9952bef19da1 142 uint32_t pcm2pdm_samples(uint32_t PCM_samples);
Davidroid 20:9952bef19da1 143
Davidroid 20:9952bef19da1 144 /**
Davidroid 20:9952bef19da1 145 * @brief Converting audio data from PDM to PCM.
Davidroid 20:9952bef19da1 146 * @param output_buffer Pointer to output PCM buffer data.
Davidroid 20:9952bef19da1 147 * @param input_buffer Pointer to input PDM buffer data.
Davidroid 20:9952bef19da1 148 * @param volume Volume level (it must be in the range [0..PDM2PCM_MAX_VOLUME]).
Davidroid 20:9952bef19da1 149 * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
Davidroid 20:9952bef19da1 150 */
Davidroid 20:9952bef19da1 151 status_t convert(int16_t *output_buffer, uint16_t *input_buffer, uint32_t volume);
davide.aliprandi@st.com 2:9f389fd8fb2e 152
davide.aliprandi@st.com 2:9f389fd8fb2e 153 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 154 * @brief Scrambling audio data.
davide.aliprandi@st.com 2:9f389fd8fb2e 155 * @param output_buffer Pointer to output PDM buffer data.
davide.aliprandi@st.com 2:9f389fd8fb2e 156 * @param input_buffer Pointer to input PDM buffer data.
davide.aliprandi@st.com 2:9f389fd8fb2e 157 * @param size Size of the buffers (thay has to be equally sized).
davide.aliprandi@st.com 2:9f389fd8fb2e 158 * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
davide.aliprandi@st.com 2:9f389fd8fb2e 159 */
davide.aliprandi@st.com 2:9f389fd8fb2e 160 status_t scramble(uint16_t *output_buffer, uint16_t *input_buffer, uint32_t size);
davide.aliprandi@st.com 2:9f389fd8fb2e 161
davide.aliprandi@st.com 2:9f389fd8fb2e 162 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 163 * @brief Demuxing audio data.
davide.aliprandi@st.com 2:9f389fd8fb2e 164 * @param output_buffer Pointer to output PDM buffer data.
davide.aliprandi@st.com 2:9f389fd8fb2e 165 * @param input_buffer Pointer to input PDM buffer data.
davide.aliprandi@st.com 2:9f389fd8fb2e 166 * @param size Size of the buffers (thay has to be equally sized).
davide.aliprandi@st.com 2:9f389fd8fb2e 167 * @retval COMPONENT_OK in case of success, COMPONENT_ERROR otherwise.
davide.aliprandi@st.com 2:9f389fd8fb2e 168 */
davide.aliprandi@st.com 2:9f389fd8fb2e 169 status_t demux(uint16_t *output_buffer, uint16_t *input_buffer, uint32_t size);
davide.aliprandi@st.com 2:9f389fd8fb2e 170
davide.aliprandi@st.com 2:9f389fd8fb2e 171
davide.aliprandi@st.com 2:9f389fd8fb2e 172 protected:
davide.aliprandi@st.com 2:9f389fd8fb2e 173
davide.aliprandi@st.com 2:9f389fd8fb2e 174 uint32_t _frequency;
davide.aliprandi@st.com 2:9f389fd8fb2e 175 uint32_t _channels;
Davidroid 20:9952bef19da1 176 uint32_t _decimation_factor;
davide.aliprandi@st.com 2:9f389fd8fb2e 177 #ifdef USE_OPEN_PDM2PCM_LIBRARY
davide.aliprandi@st.com 2:9f389fd8fb2e 178 TPDMFilter_InitStruct _PDM2PCM_filter[PDM2PCM_FILTER_SIZE];
davide.aliprandi@st.com 2:9f389fd8fb2e 179 #else
davide.aliprandi@st.com 2:9f389fd8fb2e 180 PDMFilter_InitStruct _PDM2PCM_filter[PDM2PCM_FILTER_SIZE];
davide.aliprandi@st.com 2:9f389fd8fb2e 181 #endif
davide.aliprandi@st.com 2:9f389fd8fb2e 182 static const uint8_t _demux_filter[DEMUX_FILTER_SIZE];
davide.aliprandi@st.com 2:9f389fd8fb2e 183
davide.aliprandi@st.com 2:9f389fd8fb2e 184 #ifdef PDM2PCM_AUDIO_DEBUG
davide.aliprandi@st.com 2:9f389fd8fb2e 185 DigitalOut _pdm2pcm_audio_signal;
davide.aliprandi@st.com 2:9f389fd8fb2e 186 #endif
davide.aliprandi@st.com 2:9f389fd8fb2e 187 };
davide.aliprandi@st.com 2:9f389fd8fb2e 188
davide.aliprandi@st.com 2:9f389fd8fb2e 189 #endif /* __PDM2PCM_AUDIO_CLASS_H */
davide.aliprandi@st.com 2:9f389fd8fb2e 190
davide.aliprandi@st.com 2:9f389fd8fb2e 191 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/