pure sdk for main

This commit is contained in:
divadiow
2025-08-27 09:51:58 +01:00
parent f0d033f1c9
commit 0571416e7c
3283 changed files with 1577720 additions and 1 deletions
+72
View File
@@ -0,0 +1,72 @@
#include "basic_include.h"
#include "dev/audio/components/vad/auvad.h"
#include "dev/audio/components/vad/hg_auvad_v0.h"
#define WINDOW_SIZE 5 // 用于计算平均值的窗口大小
#define SCALE_FACTOR 100
struct auvad_device *vad_dev;
int32_t sp_num = 0;
int32_t sd_num = 1;
uint32_t vad_tem_buff[5];
uint32_t vad_buff_num;
uint32_t num;
volatile uint32 vad_r;
float average_energy_tem;
float smoothed_energy;
float smoothed_map_energy;
float calculate_average_energy(uint32_t *energy_window, int size, float alpha) {
float sum = 0;
float new_energy = 0;
for (int i = 0; i < size; ++i) {
sum += energy_window[i];
}
new_energy = sum / size;
smoothed_energy = alpha * new_energy + (1 - alpha) * smoothed_energy;
return smoothed_energy;
}
int map_energy_to_range(uint32_t current_energy, float average_energy, float alpha) {
if (average_energy == 0) {
// 避免除以零的情况
return 0;
}
float normalized_energy = (float)current_energy / average_energy * SCALE_FACTOR ;
smoothed_map_energy = alpha * normalized_energy + (1 - alpha) * smoothed_map_energy ;
return (uint32_t)(smoothed_map_energy);
}
static uint32_t mp3_audio_vad_calc(int16_t *data, uint32_t samples)
{
uint32_t ret = 0;
uint32_t current_energy = 0;
uint32_t mapped_energy = 0;
uint32_t vad_result[2] = {0, 0};
float average_energy = 0;
ret = auvad_calc(vad_dev, data, samples, AUVAD_CALC_MODE_ENERGY, vad_result);
current_energy = vad_result[0];
num++;
// 计算平均能量值(如果窗口未满,则只计算已有帧的平均值)
if (num >= WINDOW_SIZE - 1) {
vad_tem_buff[vad_buff_num] = current_energy;
average_energy = calculate_average_energy(vad_tem_buff, WINDOW_SIZE, 0.2);
} else {
//if(current_energy >= average_energy)
vad_tem_buff[vad_buff_num] = current_energy;
average_energy = calculate_average_energy(vad_tem_buff, vad_buff_num + 1, 0.2);
}
vad_buff_num = (vad_buff_num + 1) % WINDOW_SIZE;
average_energy_tem = average_energy;
mapped_energy = map_energy_to_range(current_energy, average_energy, 0.3);
//os_printf("Frame %d:ret:%d data:%x sample = %d Energy = %d average= %f Mapped Energy = %d\n",num + 1,ret,(int16_t *)get_stream_real_data(s_data),sample,current_energy,average_energy, mapped_energy);
if(num % 4 == 0 || num % 4 == 3){
mapped_energy = mapped_energy/3;
} else {
mapped_energy = mapped_energy/3;
}
return mapped_energy;
}