基于STM32DSP库与MATLAB的数字滤波器设计与实现
使用STM32DSP库制作的数字滤波器, 滤波器系数通过MATLAB生成。 配合STM32串口输出,在Excel中绘图,上面只是演示了低通滤波器。 源码,包括滤波器系数生成教程。
在嵌入式系统开发中,数字滤波器是一项极为实用的技术,它能对信号进行各种处理,比如去除噪声、分离不同频率成分等。今天咱们就来聊聊如何使用STM32DSP库制作数字滤波器,并且借助MATLAB生成滤波器系数,再配合STM32串口输出数据到Excel中绘图展示。这里先以低通滤波器为例来演示整个流程。
MATLAB生成滤波器系数
MATLAB 作为一款强大的数学计算与信号处理工具,生成滤波器系数那是相当方便。以低通滤波器为例,我们可以使用 fir1 函数来设计。
% 设定滤波器参数
fs = 1000; % 采样频率 1000Hz
fc = 100; % 截止频率 100Hz
n = 50; % 滤波器阶数
% 计算归一化截止频率
Wn = 2 * fc / fs;
% 使用fir1函数设计FIR低通滤波器
b = fir1(n, Wn);
% 输出滤波器系数
disp('滤波器系数:');
disp(b);
这段代码中,我们首先定义了采样频率 fs、截止频率 fc 和滤波器阶数 n。通过 2 * fc / fs 计算出归一化截止频率 Wn,这是因为 fir1 函数要求的截止频率是归一化到 $[0, 1]$ 范围的,1 代表采样频率的一半。然后使用 fir1 函数设计出FIR低通滤波器,得到滤波器系数 b,最后通过 disp 函数把系数打印出来,方便我们在后续STM32代码中使用。
STM32中使用DSP库实现滤波器
有了MATLAB生成的滤波器系数,接下来在STM32中使用DSP库实现数字滤波。假设我们使用的是STM32CubeIDE开发环境,并且已经配置好了相关的DSP库。

首先,要在代码中包含DSP库的头文件:
#include "arm_math.h"
然后,定义滤波器系数数组,把MATLAB生成的系数填进去:
const float32_t firCoeffs[51] = {
// 这里填入MATLAB生成的系数
};
接着,初始化FIR滤波器结构体:
arm_fir_instance_f32 S;
arm_fir_init_f32(&S, 51, firCoeffs, &stateF32[0], 1);
这里 armfirinit_f32 函数初始化了FIR滤波器实例 S,参数分别是滤波器实例指针、滤波器阶数、系数数组指针、状态变量数组指针和步长(这里设为1)。状态变量数组 stateF32 用于保存滤波器的内部状态,在每次滤波运算时会更新。
在主循环中,假设我们从ADC获取到采样数据 inputSample,就可以进行滤波操作:
float32_t inputSample;
float32_t outputSample;
while (1) {
// 假设这里从ADC获取到采样数据
inputSample = get_adc_sample();
arm_fir_f32(&S, inputSample, &outputSample);
// 串口发送滤波后的数据
send_data_to_uart(outputSample);
}
armfirf32 函数对输入采样数据 inputSample 进行滤波,结果存储在 outputSample 中。然后通过自定义的 senddatato_uart 函数把滤波后的数据发送出去。
STM32串口输出与Excel绘图
STM32通过串口将滤波后的数据发送出来,我们可以在电脑端使用串口助手接收数据,然后把数据复制粘贴到Excel中绘图。

使用STM32DSP库制作的数字滤波器, 滤波器系数通过MATLAB生成。 配合STM32串口输出,在Excel中绘图,上面只是演示了低通滤波器。 源码,包括滤波器系数生成教程。
在STM32代码中,配置串口发送数据的代码可能类似这样:
#include "stm32f4xx_hal.h"
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1)!= HAL_OK)
{
Error_Handler();
}
}
void send_data_to_uart(float32_t data)
{
char buffer[16];
sprintf(buffer, "%.4f\r\n", data);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
}
这里配置了USART1串口,波特率设为115200,数据位8位,停止位1位,无奇偶校验,只使用发送模式。senddatato_uart 函数将浮点型数据转换为字符串并通过串口发送出去,\r\n 是为了让数据在串口助手中换行显示,方便复制。

在Excel中,把接收到的数据粘贴到一列中,然后选择数据,点击“插入” - “图表”,选择合适的图表类型(比如折线图),就能直观地看到滤波后信号的波形啦。
以上就是使用STM32DSP库制作数字滤波器,配合MATLAB生成系数,以及STM32串口输出到Excel绘图的全过程,源码和滤波器系数生成教程都包含在这里啦,希望对大家有所帮助,后续还可以尝试其他类型的滤波器,比如高通、带通等,玩法多多!

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)