/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2024 STecgroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" #include "string.h" #include "arm_math.h" #include "math.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ #define DATA_USER 2048 #define AXIS_NUMBER 1 /* Input signal sampling rate */ #define SAMPLE_RATE 16000U #define FRAME_SIZE 1024 #define FRAME_SHIFT 512 #define NUM_MFCC_COEFFS 13 #define NUM_FILTER_BANKS 26 /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; UART_HandleTypeDef huart2; /* USER CODE BEGIN PV */ int n = 0; uint16_t ecg_x = 0.0; float ecg_buffer[DATA_USER * AXIS_NUMBER] = {0}; arm_rfft_fast_instance_f32 fft_instance; arm_dct4_instance_f32 dct_instance; arm_cfft_radix4_instance_f32 cfft_instance; arm_rfft_instance_f32 rfft_instance; float mfcc_features[NUM_MFCC_COEFFS * ((FRAME_SIZE - FRAME_SIZE) / FRAME_SHIFT + 1)]; uint32_t num_frames = (DATA_USER - FRAME_SIZE) / FRAME_SHIFT + 1; float32_t frame[FRAME_SIZE]; float32_t fft_output[FRAME_SIZE]; float32_t power_spectrum[FRAME_SIZE / 2 + 1]; float32_t mel_energies[NUM_FILTER_BANKS]; float32_t log_mel_energies[NUM_FILTER_BANKS]; float32_t dct_output[NUM_FILTER_BANKS]; float32_t pre_emphasized[DATA_USER]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); static void MX_ADC1_Init(void); /* USER CODE BEGIN PFP */ void fill_ecg_buffer(void); int __io_putchar(int ch); void pre_emphasis(float32_t *input, float32_t *output, uint32_t length, float32_t alpha); void apply_hamming_window(float32_t *frame, uint32_t length); void compute_mel_filter_banks(float32_t *power_spectrum, float32_t *mel_energies); void compute_dct(float32_t *input, float32_t *output, uint32_t length); void compute_mfcc(float32_t *input, uint32_t length, float32_t *mfcc); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ //void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc){ // ecg_x = HAL_ADC_GetValue(&hadc1); // printf("The converted value is:"); // printf("%0.2f", ecg_x); // printf("\r\n"); // HAL_ADC_Start(&hadc1); //} //void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ //// HAL_ADC_Start_IT(&hadc1); // HAL_TIM_Base_Start(&htim2); //} /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start(&hadc1); arm_rfft_fast_init_f32(&fft_instance, FRAME_SIZE); arm_dct4_init_f32(&dct_instance, &rfft_instance, &cfft_instance, NUM_FILTER_BANKS, NUM_FILTER_BANKS / 2, 0.5); // arm_dct4_init_f32(&dct_instance, &fft_instance, &S_CFFT, DATA_USER, DATA_USER / 2, 0.5f); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { ecg_x = HAL_ADC_GetValue(&hadc1); ecg_buffer[n] = ecg_x; // printf("%d ",ecg_x); HAL_ADC_Start(&hadc1); n++; if(n == DATA_USER) { n = 0; // printf("\r\n"); compute_mfcc(ecg_buffer, DATA_USER, mfcc_features); // // pre_emphasis(ecg_buffer, pre_emphasized, DATA_USER, 0.97); // // for (uint32_t i = 0; i < num_frames; i++) { // printf("%d times\r\n",i); // memcpy(frame, &pre_emphasized[i * FRAME_SHIFT], FRAME_SIZE * sizeof(float32_t)); // apply_hamming_window(frame, FRAME_SIZE); // // arm_rfft_fast_f32(&fft_instance, frame, fft_output, 0); // // arm_cmplx_mag_squared_f32(fft_output, power_spectrum, FRAME_SIZE/2+1 ); // for(int i =0;i