使用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绘图的全过程,源码和滤波器系数生成教程都包含在这里啦,希望对大家有所帮助,后续还可以尝试其他类型的滤波器,比如高通、带通等,玩法多多!

Logo

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

更多推荐