【STM32学习笔记】基于IIR算法的音频EQ均衡器方案验证与实现
该项目通过LabVIEW计算得到IIR滤波器系数,通过WiFi发送至STM32,单片机接收到该数据后则将该系数导入数学模型,经过卷积等数学运算后则会输出我们想要的音频数据1、
简介
该项目通过LabVIEW计算得到IIR滤波器系数,通过WiFi发送至STM32,单片机接收到该数据后则将该系数导入数学模型,经过卷积等数学运算后则会输出我们想要的音频数据
特点与不足
特点
1、实现简单,有标准DSP库可直接使用IIR算法
2、效果理想,失真小
3、LabVIEW实现简单,有现有IIR参数计算vi
不足
1、理论上经过IIR运算后的数据要乘以一个衰减系数才是最终值,但博主能力有限,暂时没研究明白怎么计算该衰减系数
分块介绍

1、LabVIEW上位机部分
使用椭圆滤波器,主要是因为这个vi可直接调节衰减系数,使用matlab输入filterDesigner后即可打开滤波器设计工具箱,图中是设计了一椭圆滤波器,参数如图所示,其频响曲线如图所示
后续输出的数据若增益为正会修改滤波器参数,改为增强相应dB
再后续输出的数据经过简单的编码后通过TCP发送给下位机
2、接收数据并解码,因为编码比较简单,解码也比较简单
uint8_t extract_numbers(const char *str, float32_t *numbers)
{
const char *start = strstr(str, "CMD:");
if (start == NULL) return 0;
start += 4; // 跳过 "CMD:"
const char *end = strstr(start, ",\r\n");
if (end == NULL) return 0;
int count = 0;
char *token = strtok((char *)start, ",");
while (token != NULL && count < MAX_NUMBERS)
{
numbers[count++] = (float32_t)atof(token);
token = strtok(NULL, ",");
}
return count;
}
3、IIR算法模型使用
#define NUM_STAGES 2
float32_t IIRCoeffs32LP[NUM_STAGES*5] = {
1.0f,-1.999997f,1.0f,1.999050f,-0.999052f,
1.0f,-1.999997f,1.0f,1.997055f,-0.997066f
};
float32_t IIRState[NUM_STAGES*4];
arm_biquad_casd_df1_inst_f32 S;
arm_biquad_cascade_df1_init_f32(&S, NUM_STAGES, IIRCoeffs32LP, IIRState);
arm_biquad_cascade_df1_f32(&S, fft_inputbuffer, fft_outputbuffer, BLOCK_SIZE);
NUM_STAGES :二阶滤波器的个数
IIRCoeffs32LP:IIR滤波器系数,排序为b0,b1,b2,-a1,-a2
IIRState:用于存放状态
fft_inputbuffer:输入时域数据
fft_outputbuffer:输出滤波后时域数据
BLOCK_SIZE:数据个数
资源共享
代码
https://gitee.com/creator-len/study_music
效果展示
[STM32学习]基于IIR算法的音频EQ均衡器设计
更多推荐



所有评论(0)