opt eq_design

This commit is contained in:
Steven Dan
2026-01-26 10:23:57 +08:00
parent 8d2c6c21ea
commit 897fd050e9
3 changed files with 577 additions and 638 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -41,12 +41,8 @@ char *g_eq_flash_enable_file = "eq_enable"; // EQ使能开关文件名独立
char *g_eq_flash_name_prefix = "name_"; // 模式名称文件前缀
// 外部EQ数组声明
// 改动原因进一步优化EQ参数存储策略所有采样率共用44100Hz数组
extern eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
extern eq_mode_data_t sEQ_data_48000HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
extern eq_mode_data_t sEQ_data_88200HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
extern eq_mode_data_t sEQ_data_96000HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
extern eq_mode_data_t sEQ_data_176400HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
extern eq_mode_data_t sEQ_data_192000HZ[NUM_EQ_MODES][NUM_EQ_CHANS];
extern void debug_print_eq_mode(eq_mode_data_t *eq_data);
extern unsigned int g_eq_sample_rate;
@@ -93,22 +89,8 @@ static int get_sample_rate_index(uint32_t sample_rate) {
* @return EQ数组指针NULL表示不支持的采样率
*/
static eq_mode_data_t (*get_eq_array_ptr(uint32_t sample_rate))[NUM_EQ_MODES][NUM_EQ_CHANS] {
switch (sample_rate) {
case 44100:
return &sEQ_data_44100HZ;
case 48000:
return &sEQ_data_48000HZ;
case 88200:
return &sEQ_data_88200HZ;
case 96000:
return &sEQ_data_96000HZ;
case 176400:
return &sEQ_data_176400HZ;
case 192000:
return &sEQ_data_192000HZ;
default:
return NULL;
}
// 改动原因所有采样率共用44100Hz数组
return &sEQ_data_44100HZ;
}
/**
@@ -689,13 +671,15 @@ int eq_save_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, ui
snprintf(file_path, sizeof(file_path), "%s/mode%d_band%d.bin",
g_eq_flash_base_dir, mode, band_index);
// 获取参数数据
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(sample_rate);
// 改动原因优化EQ参数存储策略统一参数源为44100Hz
// 保存参数时总是从44100Hz读取参数确保参数一致性
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(44100);
if (!eq_array) {
DPRINTF(" Error: Failed to get EQ array for sample rate %u\n", sample_rate);
DPRINTF(" Error: Failed to get EQ array for sample rate 44100 (unified source)\n");
return -1;
}
// 从44100Hz统一参数源读取参数
filter_params_t *param = &(*eq_array)[mode][channel].bands[band_index];
// 创建文件头
@@ -718,19 +702,10 @@ int eq_save_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, ui
DPRINTF(" Successfully saved single parameter to %s\n", file_path);
// 为所有采样率计算并应用系数
for (int i = 0; i < EQ_FLASH_MAX_SAMPLE_RATES; i++) {
uint32_t fs = supported_sample_rates[i];
if (fs != sample_rate) { // 避免重复处理当前采样率
eq_mode_data_t (*target_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(fs);
if (target_array) {
// 复制参数到目标采样率
(*target_array)[mode][channel].bands[band_index] = *param;
// 这里可以添加系数计算逻辑
//DPRINTF(" Applied parameter to sample rate %u\n", fs);
}
}
}
// 改动原因优化EQ参数存储策略参数保存后需要同步到44100Hz并更新所有采样率
// 确保44100Hz作为统一参数源然后通过copy_params_from_44100函数同步到其他采样率
// 注意:这里只保存参数,系数会在切换采样率时动态计算
// 参数已经保存到Flash加载时会自动应用到所有采样率
return 0;
}
@@ -1797,30 +1772,8 @@ int delete_flash_gain_and_names(uint8_t mode) {
void restore_mode_default_params(uint8_t mode, uint32_t sample_rate) {
if (mode >= NUM_EQ_MODES) return;
// 选择对应的EQ数据数组
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL;
switch (sample_rate) {
case 44100:
eq_array = &sEQ_data_44100HZ;
break;
case 48000:
eq_array = &sEQ_data_48000HZ;
break;
case 88200:
eq_array = &sEQ_data_88200HZ;
break;
case 96000:
eq_array = &sEQ_data_96000HZ;
break;
case 176400:
eq_array = &sEQ_data_176400HZ;
break;
case 192000:
eq_array = &sEQ_data_192000HZ;
break;
default:
return;
}
// 改动原因所有采样率共用44100Hz数组
eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ;
if (eq_array == NULL) return;
@@ -1865,26 +1818,17 @@ void restore_mode_default_params(uint8_t mode, uint32_t sample_rate) {
int restore_default_eq_params(uint8_t mode) {
DPRINTF("Restoring default EQ params for mode %d\n", mode);
// 获取所有支持的采样率
const uint32_t supported_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000};
int num_rates = sizeof(supported_sample_rates) / sizeof(supported_sample_rates[0]);
// 改动原因所有采样率共用44100Hz数组只需要恢复44100Hz数组
if (mode == 0xFF) {
// 恢复所有模式的默认参数
DPRINTF(" Restoring all modes to default parameters\n");
for (uint8_t m = 0; m < NUM_EQ_MODES; m++) {
for (int rate_idx = 0; rate_idx < num_rates; rate_idx++) {
uint32_t fs = supported_sample_rates[rate_idx];
restore_mode_default_params(m, fs);
}
restore_mode_default_params(m, 44100); // 恢复44100Hz数组
}
} else {
// 恢复指定模式的默认参数
DPRINTF(" Restoring mode %d to default parameters\n", mode);
for (int rate_idx = 0; rate_idx < num_rates; rate_idx++) {
uint32_t fs = supported_sample_rates[rate_idx];
restore_mode_default_params(mode, fs);
}
restore_mode_default_params(mode, 44100); // 恢复44100Hz数组
}
DPRINTF(" Default parameters restored successfully\n");

View File

@@ -140,6 +140,36 @@ typedef enum {
TEST_CMD = 0xF0,
FW_VERSION = 0xF1,
FLASH_ID = 0xF2,
// EQ命令定义 (0x40-0x5C)
SET_EQ_MODE = 0x40, // 切换EQ模式
GET_EQ_MODE = 0x41, // 获取当前EQ模式信息
SET_MODE_GAIN_AND_NAME = 0x42, // 设置模式整体增益和名称
SET_EQ_PARAMS = 0x43, // 发送EQ参数
GET_EQ_PARAMS = 0x44, // 读取EQ参数
GET_DEVICE_INFO = 0x45, // 获取设备信息
RESET_EQ_PARAMS = 0x46, // 复位EQ参数
GET_EQ_MODE_COUNT = 0x47, // 获取EQ模式总数
SET_AND_SAVE_EQ_MODE = 0x48, // 设置并保存EQ模式
SET_VOLUME = 0x49, // 设置音量级别
GET_VOLUME = 0x4A, // 获取音量级别
GET_LED_INFO = 0x4B, // 获取LED信息
SET_LED_SWITCH = 0x4C, // 设置LED开关
GET_LED_SWITCH = 0x4D, // 获取LED开关
GET_LED_STATUS = 0x4E, // 获取LED状态
GET_LED_COUNT = 0x4F, // 获取LED总数
GET_UAC_MODE_INFO = 0x50, // 获取UAC模式信息
SET_UAC_MODE = 0x51, // 设置UAC模式
GET_CURRENT_UAC_MODE = 0x52, // 获取当前UAC模式
SET_EQ_ENABLE = 0x53, // 设置EQ使能开关
GET_EQ_ENABLE = 0x54, // 获取EQ使能开关
GET_SAMPLE_FORMAT = 0x55, // 获取采样率和格式
SET_GAIN_MODE = 0x56, // 设置增益模式
GET_GAIN_MODE = 0x57, // 获取增益模式
SET_FILTER_MODE = 0x58, // 设置滤波器模式
GET_FILTER_MODE = 0x59, // 获取滤波器模式
SET_GAME_MODE = 0x5A, // 设置游戏模式
GET_GAME_MODE = 0x5B, // 获取游戏模式
GET_FIRMWARE_VERSION = 0x5C, // 获取固件版本
CMD_NONE = 0xFF
} UartCmdType;