基于STM32F4和MATLAB的FIR数字低通滤波器实现
创作时间:
作者:
@小白创作中心
基于STM32F4和MATLAB的FIR数字低通滤波器实现
引用
CSDN
1.
https://blog.csdn.net/m0_74408701/article/details/144581825
本文将介绍如何使用STM32F4微控制器和MATLAB实现FIR数字低通滤波器。通过HAL库和CubeMX工具,我们将完成从理论概念到实际硬件实现的全过程。
FIR滤波器基本概念
FIR(Finite Impulse Response)滤波器是一种有限冲激响应滤波器,其输出仅取决于当前及之前的输入值。与IIR(Infinite Impulse Response)滤波器不同,FIR滤波器不依赖于过去的输出值,因此具有线性相位特性,适用于需要保持信号相位一致性的场合。
FIR滤波器的关键在于其抽头系数(h(n)),这些系数决定了滤波器的频率响应特性。通过合理设置这些系数,可以实现低通、高通、带通或带阻等不同类型的滤波效果。
实践过程
MATLAB配置
在MATLAB中,我们可以使用信号处理工具箱来计算FIR滤波器的抽头系数。通过设置通带频率(Fpass)和阻带频率(Fstop),可以生成满足特定频率响应要求的滤波器系数。
导出的抽头系数如下:
uint16_t BL = 24;
float32_t TB[24] = {
0.0013 ,
0.0056 ,
-0.0086 ,
-0.0048 ,
0.0218 ,
-0.0093 ,
-0.0332 ,
0.0456 ,
0.0245 ,
-0.1186 ,
0.0638 ,
0.5119 ,
0.5119 ,
0.0638 ,
-0.1186 ,
0.0245 ,
0.0456 ,
-0.0332 ,
-0.0093 ,
0.0218 ,
-0.0048 ,
-0.0086 ,
0.0056 ,
0.0013
};
STM32F4配置
使用STM32CubeMX工具,我们可以方便地配置STM32F4的时钟、ADC和DMA等外设。关键配置包括:
- 时钟树配置:确保系统时钟满足采样频率要求
- ADC配置:使用定时器触发ADC采样,确保采样频率稳定
- DMA配置:使用DMA传输ADC采样数据,提高数据处理效率
代码实现
在Keil中,我们需要引入STM32的DSP库,并配置相应的头文件。关键代码包括:
- 初始化FIR滤波器实例
- 读取ADC采样数据
- 调用FIR滤波函数处理数据
- 通过串口输出处理结果
#include "arm_math.h"
#include "arm_const_structs.h"
#include "stdio.h"
#include <stdlib.h>
int fputc(int ch, FILE *fp)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *fp)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
int main(void)
{
/* 初始化HAL库 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config();
/* 初始化外设 */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
/* 开始ADC采样 */
HAL_TIM_Base_Start(&htim3);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1_ConvertedValue, ADC1_DMA_Size);
printf("init_ok\r\n");
/* 初始化FIR滤波器 */
arm_fir_instance_f32 *S = (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32));
arm_fir_init_f32(S, BL, TB, pState, blockSize);
while (1)
{
if (flag == 1)
{
flag = 0;
HAL_Delay(1000);
printf("/**************************************/\r\n");
for (i = 0; i < FFT_LENGTH; i++)
{
fir_inputbuf[i] = (float)ADC1_ConvertedValue[i] * 3.3 / 4096;
}
arm_fir_f32(S, fir_inputbuf, fir_outputbuf, blockSize);
for (i = 0; i < FFT_LENGTH; i++)
{
printf("%f,%f\r\n", (float)ADC1_ConvertedValue[i] * 3.3 / 4096, fir_outputbuf[i]);
}
}
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1_ConvertedValue, ADC1_DMA_Size);
}
}
实验验证
通过波形发生器产生不同频率的正弦波信号,并加入直流偏置。STM32采集信号后进行FIR滤波处理,最后通过串口将原始信号和滤波后的信号发送至上位机进行分析。
测试结果显示,对于高频信号(如4KHz正弦波),滤波后的信号振幅趋近于0,验证了低通滤波器的有效性。
热门推荐
新版《原发性肝癌诊疗指南》发布:建议高危人群每隔6个月做筛查
高脂血症的危害与治疗:你必须了解的健康隐患
从模拟到数字:深入探索降噪耳机的混合信号处理技术
心阴虚和心阳虚的主要区别是什么
肠癌患者应如何进行腹腔热灌注
法庭发问40技:如何有效质询证人
向法院申请执行,你需要了解的法律知识
如何选择适合自己的减肥计划?
鍛鍊臀肌好處多 | 遠離運動傷害,減少下背、髖部、膝蓋痛!
在城市漫步中领略别样风景
ESG如何助力企业实现可持续发展?
区块链技术在供应链管理中的应用
蓄冷技术——冷链物流背后的科技力量
关于“善终”,这份研究报告采访了逝者家属、医护等三千多人
探秘国外公司:如何查到公司老板的信息
建筑阻尼器:保障摩天大楼安全的“隐形卫士”
建筑阻尼器的应用与发展
广宁县:“竹经济+绿引擎”跑出山区县发展加速度
马自达多久保养一次
《权力的游戏》夜王身份之谜与史塔克家族的联系
买房贷款等额本金计算公式及法律依据详解
Excel逐步回归分析完整指南:从数据准备到模型评价
阿莫西林吃多了会怎么样
大股东持股比例变动需要披露吗
期货交易中的杠杆机制:以小博大的投资利器
痛风患者这样吃零食最安全!
申请强制执行时间规定多久
揭秘试管婴儿成功率:妊娠率与活产率的区别与联系
游戏化旅游小镇:如何打造“趣味通吃”的多元体验空间
鲜奶检测报告及检测要求参考(CMA/CNAS检测中心)/2024