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

View File

@@ -16,6 +16,7 @@
#endif
extern void device_reboot(void);
//extern void delay_milliseconds(unsigned int);
// 常量定义
#define EQ_DISABLED_MODE 10 // 禁用EQ的模式编号
@@ -26,14 +27,26 @@ extern void device_reboot(void);
#include <stdbool.h>
#include <string.h>
#include "eq_params_44100.h"
#include "eq_params_48000.h"
#include "eq_params_88200.h"
#include "eq_params_96000.h"
#include "eq_params_176400.h"
#include "eq_params_192000.h"
// 改动原因进一步优化EQ参数存储策略所有采样率共用44100Hz数组
// 参数在所有采样率下是相同的,只有系数需要根据采样率动态计算
// 切换采样率时直接使用44100Hz数组的参数重新计算系数即可
/**
* @brief 获取指定采样率的EQ数组指针统一使用44100Hz数组
* @param sample_rate 采样率
* @return EQ数组指针始终返回44100Hz数组
*
* 改动原因所有采样率共用44100Hz数组参数相同系数根据采样率动态计算
*/
static inline eq_mode_data_t (*get_eq_array_ptr_common(uint32_t sample_rate))[NUM_EQ_MODES][NUM_EQ_CHANS] {
// 所有采样率都使用44100Hz数组参数源
// 注意:切换采样率时需要重新计算系数
return &sEQ_data_44100HZ;
}
#include "eq_coefficient_calculator.h"
#include "biquad_standalone.h"
#include "eq_flash_storage.h"
#include "user_func.h" // 改动原因包含check_sum函数声明用于uart_checksum宏定义
static struct {
bool is_read_device_params_request; // 设备参数读取请求标志
} device_params_request = {0};
@@ -452,7 +465,32 @@ static inline int32_t apply_gain(int32_t sample, int32_t gain_db) {
return result;
}
extern void delay_milliseconds(unsigned int);
/**
* @brief 设置采样率标记所有采样率共用44100Hz数组
* @param sample_rate 目标采样率
* @param mode 模式号
* @return 成功返回0失败返回-1
*
* 改动原因所有采样率共用44100Hz数组参数相同只需要设置sample_rate标记
* 系数会根据采样率动态计算,不需要复制参数
*/
static int copy_params_from_44100(uint32_t sample_rate, uint8_t mode) {
if (mode >= NUM_EQ_MODES) {
debug_printf("Error: Invalid mode %d in copy_params_from_44100\n", mode);
return -1;
}
// 改动原因所有采样率共用44100Hz数组只需要设置sample_rate标记
// 参数已经存储在44100Hz数组中不需要复制
for (int ch = 0; ch < NUM_EQ_CHANS; ch++) {
sEQ_data_44100HZ[mode][ch].sample_rate = sample_rate;
// 重置total_bshift将在计算系数时更新
sEQ_data_44100HZ[mode][ch].total_bshift = 0;
}
debug_printf("Set sample rate to %dHz for mode %d (using 44100Hz array)\n", sample_rate, mode);
return 0;
}
/**
* @brief 动态计算当前模式所有band的系数
@@ -463,48 +501,26 @@ extern void delay_milliseconds(unsigned int);
* 根据process_send_params函数中0x8d命令的逻辑实现当前模式所有band的系数计算
* 如果是bypass类型直接赋值bypass系数不计算bshift
* 正确计算total_bshift作为所有非bypass滤波器bshift的累加
*
* 改动原因在计算系数前先从44100Hz统一参数源复制参数到当前采样率
*/
int calculate_current_mode_coefficients(uint32_t sample_rate, uint8_t mode) {
debug_printf("calculate_current_mode_coefficients: sample_rate=%d, mode=%d\n", sample_rate, mode);
// 改动原因在计算系数前先从44100Hz统一参数源复制参数到当前采样率
// 确保所有采样率的参数都从统一源同步
if (copy_params_from_44100(sample_rate, mode) != 0) {
debug_printf("Warning: Failed to copy params from 44100Hz, continuing with existing params\n");
}
if (mode >= NUM_EQ_MODES) {
debug_printf("Error: Invalid mode %d (max: %d)\n", mode, NUM_EQ_MODES - 1);
return -1;
}
// 获取对应采样率和模式的EQ数据指针
eq_mode_data_t *eq_data = NULL;
eq_mode_data_t *eq_data_2 = NULL;
switch (sample_rate) {
case 44100:
eq_data = &sEQ_data_44100HZ[mode][0];
eq_data_2 = &sEQ_data_44100HZ[mode][1];
break;
case 48000:
eq_data = &sEQ_data_48000HZ[mode][0];
eq_data_2 = &sEQ_data_48000HZ[mode][1];
break;
case 88200:
eq_data = &sEQ_data_88200HZ[mode][0];
eq_data_2 = &sEQ_data_88200HZ[mode][1];
break;
case 96000:
eq_data = &sEQ_data_96000HZ[mode][0];
eq_data_2 = &sEQ_data_96000HZ[mode][1];
break;
case 176400:
eq_data = &sEQ_data_176400HZ[mode][0];
eq_data_2 = &sEQ_data_176400HZ[mode][1];
break;
case 192000:
eq_data = &sEQ_data_192000HZ[mode][0];
eq_data_2 = &sEQ_data_192000HZ[mode][1];
break;
default:
debug_printf("Error: Unsupported sample rate %d\n", sample_rate);
return -1;
}
// 改动原因所有采样率共用44100Hz数组
eq_mode_data_t *eq_data = &sEQ_data_44100HZ[mode][0];
eq_mode_data_t *eq_data_2 = &sEQ_data_44100HZ[mode][1];
if (eq_data == NULL || eq_data_2 == NULL) {
debug_printf("Error: eq_data pointer is NULL\n");
@@ -605,14 +621,23 @@ uint32_t init_eq_data(unsigned sample_freq) {
clear_eq_status(sample_freq, ch);
}
// 动态初始化所有模式的系数
// 遍历所有EQ模式为当前采样率计算系数
debug_printf("Initializing coefficients for all EQ modes at %d Hz\n", sample_freq);
// 改动原因优化EQ参数存储策略从44100Hz统一参数源复制参数到当前采样率
// 然后为所有模式计算系数,确保参数同步
debug_printf("Initializing EQ parameters from 44100Hz source for sample rate %d Hz\n", sample_freq);
if (calculate_current_mode_coefficients(sample_freq, g_current_eq_mode) == 0) {
debug_printf("Successfully initialized coefficients for mode %d\n", g_current_eq_mode);
// 为所有模式复制参数并计算系数
for (int mode = 0; mode < NUM_EQ_MODES; mode++) {
// 从44100Hz复制参数到当前采样率
if (copy_params_from_44100(sample_freq, mode) == 0) {
// 计算系数
if (calculate_current_mode_coefficients(sample_freq, mode) == 0) {
debug_printf("Successfully initialized mode %d for sample rate %d Hz\n", mode, sample_freq);
} else {
debug_printf("Warning: Failed to initialize coefficients for mode %d\n", g_current_eq_mode);
debug_printf("Warning: Failed to calculate coefficients for mode %d\n", mode);
}
} else {
debug_printf("Warning: Failed to copy params for mode %d\n", mode);
}
}
debug_printf("EQ initialization completed for sample rate %d Hz\n", sample_freq);
@@ -629,19 +654,10 @@ void update_eq_post_gain(void) {
g_mode_info.mode_gains[mode] = gain; // 更新存储的值
}
// 改动原因所有采样率共用44100Hz数组直接更新即可
if (sEQ_data_44100HZ[mode][0].post_gain_db != gain) {
sEQ_data_44100HZ[mode][0].post_gain_db = gain;
sEQ_data_44100HZ[mode][1].post_gain_db = gain;
sEQ_data_48000HZ[mode][0].post_gain_db = gain;
sEQ_data_48000HZ[mode][1].post_gain_db = gain;
sEQ_data_88200HZ[mode][0].post_gain_db = gain;
sEQ_data_88200HZ[mode][1].post_gain_db = gain;
sEQ_data_96000HZ[mode][0].post_gain_db = gain;
sEQ_data_96000HZ[mode][1].post_gain_db = gain;
sEQ_data_176400HZ[mode][0].post_gain_db = gain;
sEQ_data_176400HZ[mode][1].post_gain_db = gain;
sEQ_data_192000HZ[mode][0].post_gain_db = gain;
sEQ_data_192000HZ[mode][1].post_gain_db = gain;
}
}
}
@@ -683,31 +699,8 @@ void clear_eq_status(unsigned sample_freq, unsigned ch_no) {
return;
}
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL;
// Select EQ data based on sample rate
switch(sample_freq) {
case 44100:
eq_data = &sEQ_data_44100HZ;
break;
case 48000:
eq_data = &sEQ_data_48000HZ;
break;
case 88200:
eq_data = &sEQ_data_88200HZ;
break;
case 96000:
eq_data = &sEQ_data_96000HZ;
break;
case 176400:
eq_data = &sEQ_data_176400HZ;
break;
case 192000:
eq_data = &sEQ_data_192000HZ;
break;
default:
eq_data = &sEQ_data_48000HZ; // Use 48kHz data by default
}
// 改动原因所有采样率共用44100Hz数组
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ;
// Clear status for the specified sample rate, mode, and channel
for (n = 0; n < MAX_EQ_BANDS + 1; n++) {
@@ -886,32 +879,10 @@ int32_t handler_eq_filter(unsigned sample_freq, uint32_t ch, int32_t new_sample)
return temp_sample;
}
if (ch < NUM_EQ_CHANS) {
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL;
// Select EQ data based on sample rate
switch(sample_freq) {
case 44100:
eq_data = &sEQ_data_44100HZ;
break;
case 48000:
eq_data = &sEQ_data_48000HZ;
break;
case 88200:
eq_data = &sEQ_data_88200HZ;
break;
case 96000:
eq_data = &sEQ_data_96000HZ;
break;
case 176400:
eq_data = &sEQ_data_176400HZ;
break;
case 192000:
eq_data = &sEQ_data_192000HZ;
break;
default:
eq_data = &sEQ_data_48000HZ; // Use 48kHz data by default
}
if (ch < NUM_EQ_CHANS) {
// 改动原因所有采样率共用44100Hz数组
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ;
// 应用增益或衰减 (Q24格式)
// 改动原因修改post_gain_db范围检查为0到-50dB确保只处理有效范围内的gain值
@@ -956,29 +927,10 @@ int32_t handler_eq_filter(unsigned sample_freq, uint32_t ch, int32_t new_sample)
void debug_print_eq_params(unsigned sample_freq) {
unsigned mode = g_current_eq_mode;
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL;
// 改动原因:使用公用数组,通过函数获取对应采样率的数组指针
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr_common(sample_freq);
// Select EQ data based on sample rate
switch(sample_freq) {
case 44100:
eq_data = &sEQ_data_44100HZ;
break;
case 48000:
eq_data = &sEQ_data_48000HZ;
break;
case 88200:
eq_data = &sEQ_data_88200HZ;
break;
case 96000:
eq_data = &sEQ_data_96000HZ;
break;
case 176400:
eq_data = &sEQ_data_176400HZ;
break;
case 192000:
eq_data = &sEQ_data_192000HZ;
break;
default:
if (eq_data == NULL) {
debug_printf("Error: Unsupported sample rate %u\n", sample_freq);
return;
}
@@ -1282,46 +1234,11 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
uint32_t all_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000};
int num_rates = sizeof(all_sample_rates) / sizeof(all_sample_rates[0]);
for (int i = 0; i < num_rates; i++) {
uint32_t fs = all_sample_rates[i];
// 查找当前采样率下相同mode的EQ数据
switch (fs) {
case 44100:
eq_data = &sEQ_data_44100HZ[mode][0];
eq_data_2 = &sEQ_data_44100HZ[mode][1];
break;
case 48000:
eq_data = &sEQ_data_48000HZ[mode][0];
eq_data_2 = &sEQ_data_48000HZ[mode][1];
break;
case 88200:
eq_data = &sEQ_data_88200HZ[mode][0];
eq_data_2 = &sEQ_data_88200HZ[mode][1];
break;
case 96000:
eq_data = &sEQ_data_96000HZ[mode][0];
eq_data_2 = &sEQ_data_96000HZ[mode][1];
break;
case 176400:
eq_data = &sEQ_data_176400HZ[mode][0];
eq_data_2 = &sEQ_data_176400HZ[mode][1];
break;
case 192000:
eq_data = &sEQ_data_192000HZ[mode][0];
eq_data_2 = &sEQ_data_192000HZ[mode][1];
break;
default:
continue;
}
// 设置EQ整体增益到指定采样率和模式
if (eq_data != NULL && eq_data_2 != NULL && mode < NUM_EQ_MODES) {
// 改动原因使用限制后的gain值确保所有post_gain_db都在0到-50dB范围内
eq_data->post_gain_db = new_gain;
eq_data_2->post_gain_db = new_gain;
debug_printf("Set EQ overall gain to %d dB for mode %d, sample rate %d Hz\n", new_gain, mode, fs);
// 标记参数已修改需要同步到Flash
}
// 改动原因所有采样率共用44100Hz数组直接更新即可
if (mode < NUM_EQ_MODES) {
sEQ_data_44100HZ[mode][0].post_gain_db = new_gain;
sEQ_data_44100HZ[mode][1].post_gain_db = new_gain;
debug_printf("Set EQ overall gain to %d dB for mode %d (applied to all sample rates)\n", new_gain, mode);
}
set_mode_gain(mode, new_gain);
@@ -1803,7 +1720,98 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
return false;
}
// 更新所有采样率的对应模式参数
// 改动原因优化EQ参数存储策略统一参数源为44100Hz
// 先更新44100Hz的参数统一参数源然后通过copy_params_from_44100同步到其他采样率
// 解析新参数(只解析一次,避免重复解析)
filter_params_t new_params;
memset(&new_params, 0, sizeof(filter_params_t));
new_params.index = band_index;
new_params.type = (filter_type_t)data[4];
// 解析浮点参数(小端序)
uint32_t fc_bytes = data[5] | (data[6] << 8) | (data[7] << 16) | (data[8] << 24);
memcpy(&new_params.fc, &fc_bytes, 4);
uint32_t q_bytes = data[9] | (data[10] << 8) | (data[11] << 16) | (data[12] << 24);
memcpy(&new_params.q, &q_bytes, 4);
uint32_t bw_bytes = data[13] | (data[14] << 8) | (data[15] << 16) | (data[16] << 24);
memcpy(&new_params.bw, &bw_bytes, 4);
uint32_t gain_bytes = data[17] | (data[18] << 8) | (data[19] << 16) | (data[20] << 24);
memcpy(&new_params.gain, &gain_bytes, 4);
DPRINTF("Parsed new params: fc=%.2f, q=%.3f, bw=%.2f, gain=%.2f\n",
new_params.fc, new_params.q, new_params.bw, new_params.gain);
// 检查参数有效性
if ((isnan(new_params.fc) || isnan(new_params.q) || isnan(new_params.bw) || isnan(new_params.gain)) || new_params.fc == 0) {
debug_printf("Error: Invalid float values detected!\n");
return false;
}
// 只更新44100Hz统一参数源
eq_mode_data_t *eq_data_44100 = &sEQ_data_44100HZ[mode][0];
filter_params_t *band_44100 = &eq_data_44100->bands[band_index];
// 检查参数是否变化
if (eq_single_params_different(band_44100, &new_params)) {
debug_printf("Parameter changed for mode %d, band %d, updating 44100Hz source\n", mode, band_index);
// 更新44100Hz的参数统一参数源
band_44100->type = new_params.type;
band_44100->fc = new_params.fc;
band_44100->q = new_params.q;
band_44100->bw = new_params.bw;
band_44100->gain = new_params.gain;
// 同步到第二个通道
eq_mode_data_t *eq_data_44100_ch1 = &sEQ_data_44100HZ[mode][1];
filter_params_t *band_44100_ch1 = &eq_data_44100_ch1->bands[band_index];
memcpy(band_44100_ch1, band_44100, sizeof(filter_params_t));
// 改动原因当EQ禁用时不设置强制模式切换标志避免实际切换模式
if (g_eq_enable == 1) {
SET_SHARED_GLOBAL(g_force_request_eq_mode_change, 1);
} else {
debug_printf("EQ disabled: Parameter updated for saved mode %d (not switching current mode)\n", mode);
}
// 同步参数到所有其他采样率
uint32_t all_sample_rates[] = {48000, 88200, 96000, 176400, 192000};
int num_rates = sizeof(all_sample_rates) / sizeof(all_sample_rates[0]);
for (int rate_idx = 0; rate_idx < num_rates; rate_idx++) {
uint32_t fs = all_sample_rates[rate_idx];
// 复制参数到目标采样率
if (copy_params_from_44100(fs, mode) == 0) {
// 计算系数
calculate_current_mode_coefficients(fs, mode);
debug_printf("Synced params and calculated coefficients for %dHz\n", fs);
}
}
// 计算44100Hz的系数
calculate_current_mode_coefficients(44100, mode);
// 改动原因标记参数已修改需要同步到Flash
// 使用eq_process_single_param_change处理参数变化并标记为脏
if (eq_process_single_param_change(44100, mode, 0, band_index, band_44100) == 0) {
debug_printf("Successfully processed parameter change for 44100Hz channel 0\n");
} else {
debug_printf("Error processing parameter change for 44100Hz channel 0\n");
}
// 标记模式为脏需要同步到Flash
eq_flash_mark_dirty(mode);
debug_printf("Marked mode %d as dirty for Flash sync\n", mode);
debug_printf("Parameter update completed for mode %d, band %d\n", mode, band_index);
} else {
debug_printf("Parameter unchanged for mode %d, band %d\n", mode, band_index);
}
return true;
}
#if 0
// 旧代码已重构,以下代码不再使用
uint32_t all_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000};
int num_rates = sizeof(all_sample_rates) / sizeof(all_sample_rates[0]);
@@ -1816,21 +1824,10 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
if (fs == 44100) {
eq_data = &sEQ_data_44100HZ[mode][0];
eq_data_2 = &sEQ_data_44100HZ[mode][1];
} else if (fs == 48000) {
eq_data = &sEQ_data_48000HZ[mode][0];
eq_data_2 = &sEQ_data_48000HZ[mode][1];
} else if (fs == 88200) {
eq_data = &sEQ_data_88200HZ[mode][0];
eq_data_2 = &sEQ_data_88200HZ[mode][1];
} else if (fs == 96000) {
eq_data = &sEQ_data_96000HZ[mode][0];
eq_data_2 = &sEQ_data_96000HZ[mode][1];
} else if (fs == 176400) {
eq_data = &sEQ_data_176400HZ[mode][0];
eq_data_2 = &sEQ_data_176400HZ[mode][1];
} else if (fs == 192000) {
eq_data = &sEQ_data_192000HZ[mode][0];
eq_data_2 = &sEQ_data_192000HZ[mode][1];
} else {
// 改动原因所有采样率共用44100Hz数组
eq_data = &sEQ_data_44100HZ[mode][0];
eq_data_2 = &sEQ_data_44100HZ[mode][1];
}
// 检查指针有效性和mode范围
@@ -1944,7 +1941,9 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
debug_printf("Parameter processing completed for all sample rates\n");
}
#endif
#endif // #if 0
#endif // #if EQ_EN (for process_send_params EQ commands section starting at line 1228)
return true;
}
@@ -1973,6 +1972,11 @@ uint8_t process_uart_set_eq_mode(uint8_t mode)
return 0x00; // 成功
}
/**
* @brief UART校验和计算函数直接复用user_func.c的check_sum函数
*/
#define uart_checksum(pbuf, len) check_sum((unsigned char *)(pbuf), (unsigned)(len))
/**
* @brief 处理串口获取EQ模式信息 (0x31)
* @param response 响应数据缓冲区
@@ -2004,11 +2008,12 @@ uint8_t process_uart_get_eq_mode(uint8_t *response, uint8_t response_size)
debug_printf("UART GET_EQ_MODE: mode=%d, gain=%d, name=%s\n", current_mode, mode_gain, mode_name);
// 构建响应数据 (串口格式: 55 AA 00 31 15 ...)
// 构建响应数据 (串口格式: 55 AA 00 41 15 ...)
// 改动原因:使用枚举名称替代数字命令码,提高代码可读性和维护性
response[0] = 0x55; // 帧头1
response[1] = 0xAA; // 帧头2
response[2] = 0x00; // 版本
response[3] = 0x31; // 命令码
response[3] = GET_EQ_MODE; // 命令码
response[4] = 0x15; // 数据长度 (21字节)
response[5] = current_mode; // 模式值
@@ -2023,11 +2028,8 @@ uint8_t process_uart_get_eq_mode(uint8_t *response, uint8_t response_size)
}
// 计算校验和
uint16_t sum = 0;
for (int i = 0; i < 26; i++) {
sum += response[i];
}
response[26] = sum % 256;
uint8_t checksum_pos = 26;
response[checksum_pos] = uart_checksum(response, checksum_pos);
return 27; // 总长度
}
@@ -2114,22 +2116,9 @@ uint8_t process_uart_set_mode_gain_and_name(uint8_t *data)
debug_printf("UART: Gain value %d clamped to %d (range: 0 to -50dB)\n", gain, clamped_gain);
}
uint32_t all_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000};
for (int i = 0; i < 6; i++) {
uint32_t fs = all_sample_rates[i];
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL;
switch (fs) {
case 44100: eq_data = &sEQ_data_44100HZ; break;
case 48000: eq_data = &sEQ_data_48000HZ; break;
case 88200: eq_data = &sEQ_data_88200HZ; break;
case 96000: eq_data = &sEQ_data_96000HZ; break;
case 176400: eq_data = &sEQ_data_176400HZ; break;
case 192000: eq_data = &sEQ_data_192000HZ; break;
}
if (eq_data != NULL) {
(*eq_data)[mode][0].post_gain_db = clamped_gain;
(*eq_data)[mode][1].post_gain_db = clamped_gain;
}
}
// 改动原因所有采样率共用44100Hz数组直接更新即可
sEQ_data_44100HZ[mode][0].post_gain_db = clamped_gain;
sEQ_data_44100HZ[mode][1].post_gain_db = clamped_gain;
// 设置到全局模式信息中(根据判断结果决定是否标记脏标志)
// 改动原因使用限制后的gain值确保存储的gain值在有效范围内
@@ -2236,12 +2225,13 @@ uint8_t process_uart_get_eq_params(uint8_t *data, uint8_t *response, uint8_t res
return 0;
}
// 构建响应数据 (串口格式: 55 AA 00 34 15 ...)
// 构建响应数据 (串口格式: 55 AA 00 44 13 ...)
// 改动原因:使用枚举名称替代数字命令码,提高代码可读性和维护性
response[0] = 0x55; // 帧头1
response[1] = 0xAA; // 帧头2
response[2] = 0x00; // 版本
response[3] = 0x34; // 命令码
response[4] = 0x15; // 数据长度 (21字节)
response[3] = GET_EQ_PARAMS; // 命令码
response[4] = 0x13; // 数据长度 (19字节: 1字节模式 + 1字节索引 + 1字节类型 + 4个float参数共16字节)
response[5] = mode;
response[6] = band_index;
@@ -2288,13 +2278,11 @@ uint8_t process_uart_get_eq_params(uint8_t *data, uint8_t *response, uint8_t res
}
// 计算校验和
uint16_t sum = 0;
for (int i = 0; i < 26; i++) {
sum += response[i];
}
response[26] = sum % 256;
// 改动原因数据长度是19字节(0x13)所以校验和位置应该是5(头部) + 19(数据) = 24
uint8_t checksum_pos = 24;
response[checksum_pos] = uart_checksum(response, checksum_pos);
return 27; // 总长度
return 25; // 总长度5(头部) + 19(数据) + 1(校验和) = 25
}
/**
@@ -2322,21 +2310,19 @@ uint8_t process_uart_get_eq_mode_count(uint8_t *response, uint8_t response_size)
debug_printf("UART GET_EQ_MODE_COUNT: count=%d, preset_count=%d\n", mode_count, preset_mode_count);
// 构建响应数据 (串口格式: 55 AA 00 36 02 ...)
// 构建响应数据 (串口格式: 55 AA 00 47 02 ...)
// 改动原因:使用枚举名称替代数字命令码,提高代码可读性和维护性
response[0] = 0x55; // 帧头1
response[1] = 0xAA; // 帧头2
response[2] = 0x00; // 版本
response[3] = 0x36; // 命令码
response[3] = GET_EQ_MODE_COUNT; // 命令码
response[4] = 0x02; // 数据长度 (2字节)
response[5] = mode_count; // 模式总数
response[6] = preset_mode_count; // 预定义模式数量
// 计算校验和
uint16_t sum = 0;
for (int i = 0; i < 7; i++) {
sum += response[i];
}
response[7] = sum % 256;
uint8_t checksum_pos = 7;
response[checksum_pos] = uart_checksum(response, checksum_pos);
return 8; // 总长度
}
@@ -2551,29 +2537,8 @@ unsigned char process_read_params(uint8_t response[]) {
int32_t target_post_gain = 0;
if (target_mode < NUM_EQ_MODES) {
// 根据当前采样率选择对应的EQ数据数组
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL;
switch(g_eq_sample_rate) {
case 44100:
eq_data = &sEQ_data_44100HZ;
break;
case 48000:
eq_data = &sEQ_data_48000HZ;
break;
case 88200:
eq_data = &sEQ_data_88200HZ;
break;
case 96000:
eq_data = &sEQ_data_96000HZ;
break;
case 176400:
eq_data = &sEQ_data_176400HZ;
break;
case 192000:
eq_data = &sEQ_data_192000HZ;
break;
default:
eq_data = &sEQ_data_48000HZ; // 默认使用48kHz数据
}
// 改动原因:使用公用数组,通过函数获取对应采样率的数组指针
eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr_common(g_eq_sample_rate);
if (eq_data != NULL) {
target_post_gain = (*eq_data)[target_mode][0].post_gain_db;

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:
// 改动原因所有采样率共用44100Hz数组
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;
}
}
/**
@@ -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;