基于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,验证了低通滤波器的有效性。
热门推荐
企业以考勤为由不加薪酬的合法情形及管理指南
一个人成熟的标准就是:拒绝别人之后,没有任何愧疚
如何通过API接口获取体育数据?从入门到进阶全攻略
什么是Enter键?
服务器IO占用过高,如何识别并解决这一问题?
什么是完善的薪酬管理制度?
破解薪酬调研困局:三招实现精准行业薪酬对标
三十岁的利路修决定退休
年检新增OBD检测,纯电与增程车是否也难以通过?该如何应对
汽车年检都包括哪些项目?氟利昂加多了怎么办?
从目录编撰、文献整理到小说史撰写
如何制定项目管理依据
青茶发酵程度详解
高专和高职有什么区别?
【买车必看】揭秘:为何查车况是二手车交易的第一步?
注册泰国合资公司、全外资公司和分公司有哪些要求
头孢误服过量需紧急处理,洗胃与否看症状!
世界史上公认的十大帝王
2024年清明节诵读追思活动简报合集
个人合租房转租合同:全面解析与法律建议
5000亿特别国债注资四大国有银行 已采取回报填补措施应对每股收益摊薄
投影仪连接指南:需要几根线?如何正确连接?
四种方案讲清楚,数据权限该如何设计?
各产业巨头混战,固态电池要起飞!
美制F-35系列战机事故频发 专家:暴露其在生产、供应链管理等方面问题较多
多级脉冲超声波技术在煤矿瓦斯灾害防治中的应用研究
世界空间周 中国宇航学会开展的系列科普活动精彩不断

小区公共收益超百万,物业更换引发纠纷,法院介入终调解
笔记本电脑USB接口没反应怎么办?原因及解决方法
深入分析四层/七层网关