Skip to content

Align usage of PDM.setGain() #192

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions libraries/PDM/src/PDM.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,16 @@ class PDMClass
PDMClass(int dinPin, int clkPin, int pwrPin);
virtual ~PDMClass();

int begin(int channels, long sampleRate);
int begin(int channels, int sampleRate);
void end();

virtual int available();
virtual int read(void* buffer, size_t size);

void onReceive(void(*)(void));

//PORTENTA_H7 min -12 max 51
//NANO 33 BLE SENSe min 0 max 80
void setGain(int gain);
void setBufferSize(int bufferSize);

Expand All @@ -50,7 +52,11 @@ class PDMClass
int _pwrPin;

int _channels;

int _samplerate;

int _gain;
int _init;

PDMDoubleBuffer _doubleBuffer;

void (*_onReceive)(void);
Expand Down
17 changes: 13 additions & 4 deletions libraries/PDM/src/nrf52/PDM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,22 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) :
_dinPin(dinPin),
_clkPin(clkPin),
_pwrPin(pwrPin),
_onReceive(NULL)
_onReceive(NULL),
_gain(-1),
_channels(-1),
_samplerate(-1),
_init(-1)
{
}

PDMClass::~PDMClass()
{
}

int PDMClass::begin(int channels, long sampleRate)
int PDMClass::begin(int channels, int sampleRate)
{
_channels = channels;
_samplerate = sampleRate;

// Enable high frequency oscillator if not already enabled
if (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) {
Expand Down Expand Up @@ -83,7 +88,10 @@ int PDMClass::begin(int channels, long sampleRate)
return 0; // unsupported
}

setGain(DEFAULT_PDM_GAIN);
if(_gain == -1) {
_gain = DEFAULT_PDM_GAIN;
}
nrf_pdm_gain_set(_gain, _gain);

// configure the I/O and mux
pinMode(_clkPin, OUTPUT);
Expand Down Expand Up @@ -175,7 +183,8 @@ void PDMClass::onReceive(void(*function)(void))

void PDMClass::setGain(int gain)
{
nrf_pdm_gain_set(gain, gain);
_gain = gain;
nrf_pdm_gain_set(_gain, _gain);
}

void PDMClass::setBufferSize(int bufferSize)
Expand Down
2 changes: 1 addition & 1 deletion libraries/PDM/src/rp2040/OpenPDMFilter.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ void Open_PDM_Filter_Init(TPDMFilter_InitStruct *Param)
}

sub_const = sum >> 1;
div_const = sub_const * Param->MaxVolume / 32768 / filterGain;
div_const = sub_const * Param->MaxVolume / 32768 / Param->filterGain;
div_const = (div_const == 0 ? 1 : div_const);

#ifdef USE_LUT
Expand Down
5 changes: 1 addition & 4 deletions libraries/PDM/src/rp2040/OpenPDMFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,6 @@
#define SINCN 3
#define DECIMATION_MAX 128

//#define FILTER_GAIN 16
extern uint16_t filterGain;


#define HTONS(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
#define RoundDiv(a, b) (((a)>0)?(((a)+(b)/2)/(b)):(((a)-(b)/2)/(b)))
Expand All @@ -84,6 +80,7 @@ typedef struct {
uint16_t HP_ALFA;
uint16_t bit[5];
uint16_t byte;
uint16_t filterGain;
} TPDMFilter_InitStruct;


Expand Down
42 changes: 27 additions & 15 deletions libraries/PDM/src/rp2040/PDM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ int16_t* volatile finalBuffer;
// OpenPDM filter used to convert PDM into PCM
#define FILTER_GAIN 16
TPDMFilter_InitStruct filter;
uint16_t filterGain = FILTER_GAIN;


extern "C" {
__attribute__((__used__)) void dmaHandler(void)
Expand All @@ -47,15 +45,19 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) :
_dinPin(dinPin),
_clkPin(clkPin),
_pwrPin(pwrPin),
_onReceive(NULL)
_onReceive(NULL),
_gain(-1),
_channels(-1),
_samplerate(-1),
_init(-1)
{
}

PDMClass::~PDMClass()
{
}

int PDMClass::begin(int channels, long sampleRate)
int PDMClass::begin(int channels, int sampleRate)
{
//_channels = channels; // only one channel available

Expand All @@ -71,15 +73,19 @@ int PDMClass::begin(int channels, long sampleRate)
rawBufferLength = finalBufferLength;
}

/* Initialize Open PDM library */
filter.Fs = sampleRate;
filter.nSamples = rawBufferLength;
filter.LP_HZ = sampleRate/2;
filter.HP_HZ = 10;
filter.In_MicChannels = 1;
filter.Out_MicChannels = 1;
filter.Decimation = decimation;
Open_PDM_Filter_Init(&filter);
/* Initialize Open PDM library */
filter.Fs = sampleRate;
filter.nSamples = rawBufferLength;
filter.LP_HZ = sampleRate/2;
filter.HP_HZ = 10;
filter.In_MicChannels = 1;
filter.Out_MicChannels = 1;
filter.Decimation = decimation;
if(_gain == -1) {
_gain = FILTER_GAIN;
}
filter.filterGain = _gain;
Open_PDM_Filter_Init(&filter);

// Configure PIO state machine
float clkDiv = (float)clock_get_hz(clk_sys) / sampleRate / decimation / 2;
Expand Down Expand Up @@ -110,6 +116,8 @@ int PDMClass::begin(int channels, long sampleRate)
true // Start immediately
);

_init = 1;

return 1;
}

Expand Down Expand Up @@ -142,7 +150,11 @@ void PDMClass::onReceive(void(*function)(void))

void PDMClass::setGain(int gain)
{
filterGain = gain;
_gain = gain;
if(_init == 1) {
filter.filterGain = _gain;
Open_PDM_Filter_Init(&filter);
}
}

void PDMClass::setBufferSize(int bufferSize)
Expand Down Expand Up @@ -185,4 +197,4 @@ void PDMClass::IrqHandler(bool halftranfer)

PDMClass PDM(PIN_PDM_DIN, PIN_PDM_CLK, -1);

#endif
#endif
27 changes: 14 additions & 13 deletions libraries/PDM/src/stm32/PDM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,19 @@ PDMClass::PDMClass(int dinPin, int clkPin, int pwrPin) :
_dinPin(dinPin),
_clkPin(clkPin),
_pwrPin(pwrPin),
_onReceive(NULL)
_onReceive(NULL),
_gain(-1),
_channels(-1),
_samplerate(-1),
_init(-1)
{
}

PDMClass::~PDMClass()
{
}

static int gain_db = -1;
static int _samplerate = -1;

int PDMClass::begin(int channels, long sampleRate) {
int PDMClass::begin(int channels, int sampleRate) {

if (isBoardRev2()) {
mbed::I2C i2c(PB_7, PB_6);
Expand All @@ -65,14 +66,13 @@ int PDMClass::begin(int channels, long sampleRate) {
_channels = channels;
_samplerate = sampleRate;

if (gain_db == -1) {
gain_db = 24;
if (_gain == -1) {
_gain = 24;
}

//g_pcmbuf = (uint16_t*)_doubleBuffer.data();

if(py_audio_init(channels, sampleRate, gain_db, 0.9883f)) {
if(py_audio_init(channels, sampleRate, _gain, 0.9883f)) {
py_audio_start_streaming();
_init = 1;
return 1;
}
return 0;
Expand Down Expand Up @@ -103,9 +103,10 @@ void PDMClass::onReceive(void(*function)(void))

void PDMClass::setGain(int gain)
{
gain_db = gain;
//end();
//begin(_channels, _samplerate);
_gain = gain;
if(_init == 1) {
py_audio_gain_set(gain);
}
}

void PDMClass::setBufferSize(int bufferSize)
Expand Down
12 changes: 12 additions & 0 deletions libraries/PDM/src/stm32/audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,18 @@ int py_audio_init(size_t channels, uint32_t frequency, int gain_db, float highpa
return 1;
}

void py_audio_gain_set(int gain_db)
{
// Configure PDM filters
for (int i=0; i<g_i_channels; i++) {
PDM_FilterConfig[i].mic_gain = gain_db;
//This will be called only after init so PDM_FilterConfig structure is already filled
//PDM_FilterConfig[i].output_samples_number = samples_per_channel;
//PDM_FilterConfig[i].decimation_factor = decimation_factor_const;
PDM_Filter_setConfig(&PDM_FilterHandler[i], &PDM_FilterConfig[i]);
}
}

void py_audio_deinit()
{
// Stop SAI DMA.
Expand Down
1 change: 1 addition & 0 deletions libraries/PDM/src/stm32/audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

void py_audio_deinit();
int py_audio_init(size_t g_channels, uint32_t frequency, int gain_db, float highpass);
void py_audio_gain_set(int gain_db);
void audio_pendsv_callback(void);
void py_audio_start_streaming();
void py_audio_stop_streaming();
Expand Down