opt eq_design
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user