2019-01-08 08:43 AM
Hello.
I'm trying to import the SMR module of the X-CUBE-AUDIO package in one of the projects I am working on. I wish to know the sound pressure level in dB on my microphones.
My application generates a PCM buffer filled this way: 32 samples in 16-bit format (16 samples for each channel). The sampling frequency is 16 kHz.
It seems that everything is set rightly but, when i call the smr_process function, the application goes in Hard Fault.
I am following the API call procedure shown in UM2031, pp. 16-17 (file attached).
Anyone could please help me understand what I'm doing wrong?
Below there's part of the code I am using.
The project runs on STM32F767 MCU.
/* SMR Manager */
void *pSmrPersistentMem = NULL;
void *pSmrScratchMem = NULL;
static smr_static_param_t smr_static_param;
static smr_dynamic_param_t smr_dynamic_param;
static buffer_t BufferHandler;
static buffer_t *pBufferHandler = &BufferHandler;
uint16_t PCM_Data_SMR[32]; /* PCM data buffer */
void AudioSMR_Init()
{
int32_t error = SMR_ERROR_NONE;
/* Allocat mem for Smr */
pSmrPersistentMem = malloc(smr_persistent_mem_size); /* 0x188 */
pSmrScratchMem = malloc(smr_scratch_mem_size); /* 0xF04 */
/* Effect Initialization and configuration */
/*-----------------------------------------*/
/* Enables and resets CRC-32 from STM32 HW */
__HAL_RCC_CRC_CLK_ENABLE();
CRC->CR = CRC_CR_RESET;
/* SMR effect reset */
smr_reset(pSmrPersistentMem, pSmrScratchMem);
/* SMR effect static parameters setting */
smr_static_param.sampling_rate =16000; /* only sampling rate supported */
smr_setParam(&smr_static_param, pSmrPersistentMem);
/* SMR dynamic parameters that can be updated here every frame if required */
smr_dynamic_param.enable = 1; /* SMR module enabler */
smr_dynamic_param.averaging_time = 100;
smr_dynamic_param.filter_type = SMR_PREFILTER_NONE;
smr_setConfig(&smr_dynamic_param, pSmrPersistentMem);
/* I/O buffers settings */
BufferHandler.nb_bytes_per_Sample = 2; /* 16-bit */
BufferHandler.nb_channels = 2; /* stereo */
BufferHandler.data_ptr = PCM_Data_SMR;
BufferHandler.buffer_size = 32/2; /* just half buffer is process (size per channel) */
BufferHandler.mode = INTERLEAVED;
}
void AudioSMR_Process()
{
int32_t error = SMR_ERROR_NONE;
uint32_t sample = 0;
/* output signal power sent to terminal IO */
smr_getConfig(&smr_dynamic_param, pSmrPersistentMem);
smr_process(pBufferHandler, pBufferHandler, pSmrPersistentMem);
/* output signal power sent to terminal IO */
smr_getConfig(&smr_dynamic_param, pSmrPersistentMem);
printf("Left mean power=%ld dB\n", (int32_t) ( (float) smr_dynamic_param.mean_level_left*0.25) );
printf("Right mean power=%ld dB\n", (int32_t) ( (float) smr_dynamic_param.mean_level_right*0.25));
}
2020-10-27 06:07 AM
I am not an expert for this, but I think I read somewhere that it only support 48 kHz sampling frequency.
2021-05-05 05:07 PM
Did you ever managed to get this to work? I'm trying to implement the same library but i have exactly the same error.