基于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,验证了低通滤波器的有效性。
热门推荐
2025年国债购买全攻略:渠道、步骤及注意事项
财政部官方指南:如何购买最新国债?
超长期特别国债:理性投资新宠儿
指尖上的年味:数字科技下奔腾的「新」春节文化
侧柏叶如何泡酒?用什么酒最好?多少度白酒最合适?
德川幕府的货币传奇:宽永通宝
德川家康的货币改革:宽永通宝的历史与收藏价值
宽永通宝真假大揭秘:专家教你防坑指南
利巴韦林注射液使用的正确方法
助听器如何帮助听力损失人群
助听器的作用
配助听器的目的,专家来告诉你
如何选择适合自己的助听器
揭秘天津武警:实战训练背后的硬核故事
《武媚娘传奇》:一部展现武则天性格密码的影视佳作
足三里穴:每天按揉3分钟,轻松缓解压力
蒙曼解读:武则天性格与唐代社会环境
武则天的权力游戏:从才人到皇帝的传奇之路
洛阳博物馆展出:武则天和她的时代
中医按摩治后颈痛,这些穴位你get了吗?
哈佛健康推荐:六个实用妙招预防后颈痛
六个拉伸动作,轻松缓解颈椎不适
妙佑医疗国际推荐:如何避免后颈痛?
小李探山:户外探险直播的领航者
探秘武则天乾陵:千年未解之谜
武则天:贞观遗风的现代启示
武则天的诗意人生:从《如意娘》看一代女皇的文学世界
《风起洛阳》揭秘:武则天时代的女性有多牛?
从《从军行》看李白笔下的英雄形象
《王者荣耀》李白“谪仙醉月”:一轮明月映古今的诗意之旅