简介

该项目通过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均衡器设计

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐