AI:嵌入式码农晋升之路其二

AI 辅助嵌入式 C 语言代码编写已经成为一种趋势,它为开发者带来了诸多优势,如提高开发效率、提升代码质量等。然而,目前也面临着一些挑战和局限性。随着 AI 技术的不断发展和完善,相信它将在嵌入式开发领域发挥更加重要的作用,推动嵌入式系统的发展和创新。开发者应该积极拥抱 AI 技术,合理利用 AI 辅助工具,提高自己的开发能力和效率。
本文宗旨是记录AI辅助开发的摸索和学习过程。

提问

stm32 温度检测滑动滤波,滤波器大小为20,要求去掉2个最大值,2个最小值,当采样个数小于滤波器个数时,按采样个数滤波,不去掉任何采样值。

问题描述

实现一个滑动滤波器,用于处理STM32采集的温度数据。滤波器要求:
• 滤波器大小为20。
• 去掉2个最大值和2个最小值。
• 当采样个数小于滤波器大小时,按实际采样个数滤波,且不去掉任何采样值。

在这里插入图片描述

代码

头文件( filter.h )

#ifndef _FILTER_H_
#define _FILTER_H_

#define FILTER_SIZE 20
#define REMOVE_MAX_MIN_COUNT 2

extern float temperature_samples[FILTER_SIZE];
extern int sample_count;

float sliding_filter(float new_sample);

#endif

源文件( filter.c )

#include "filter.h"
#include "stdlib.h"

float temperature_samples[FILTER_SIZE] = {0};
int sample_count = 0;

// 冒泡排序函数
void bubble_sort(float arr[], int len) {
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                float temp =[j arr];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 滑动滤波函数
float sliding_filter(float new_sample) {
    // 将新采样值加入队列
    for (int i = FILTER_SIZE - 1; i > 0; i--) {
        temperature_samples[i] = temperature_samples[i - 1];
    }
    temperature_samples[0] = new_sample;

    // 更新采样个数
    if (sample_count < FILTER_SIZE {
)        sample_count++;
    }

    float sum = 0;
    float filtered_value = 0;

    // 如果采样个数小于滤波器大小,直接计算平均值
    if (sample_count < FILTER_SIZE) {
        for (int i = 0; i < sample_count; i++) {
            sum += temperature_samples[i];
        }
        filtered_value = sum / sample_count;
    } 
    // 否则去掉2个最大值和2个最小值后计算平均值
    else {
        bubble_sort(temperature_samples);
        for (int i = REMOVE_MAX_MIN_COUNT; i < FILTER_SIZE - REMOVE_MAX_MIN_COUNT; i++) {
            sum += temperature_samples[i];
        }
        filtered_value = sum / (FILTER_SIZE - 2 * REMOVE_MAX_MIN_COUNT);
    }

    return filtered_value;
}

主程序中调用

#include "filter.h"
#include "stm32f1xx_hal.h" // 根据实际使用的STM32型号包含对应的头文件

ADC_HandleTypeDef hadc1; // 假设使用ADC1采集温度数据

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();

    while (1) {
        float new_sample = HAL_ADC_GetValue(&hadc1); // 获取新的温度采样值
        float filtered_temperature = sliding_filter(new_sample); // 进行滑动滤波处理
        // 使用filtered_temperature进行后续处理,如显示、控制等
    }
}

说明

  1. 数据存储: temperature_samples 数组用于存储滑动窗口内的温度采样值, sample_count 记录当前采样个数。
  2. 排序算法:使用冒泡排序对采样值进行排序,以便去掉最大值和最小值。
  3. 滤波逻辑:• 当采样个数小于滤波器大小时,直接计算平均值。• 当采样个数达到滤波器大小时,去掉2个最大值和2个最小值后计算平均值。
  4. 主程序调用:在主程序中定期获取新的温度采样值,并调用 sliding_filter 函数进行滤波处理。

优化提问

如何进一步优化

优化建议

在上述代码的基础上,可以通过以下几种方式进一步优化代码的性能和可读性:

  1. 优化排序算法冒泡排序的时间复杂度为O(n²),效率较低。可以改用更高效的排序算法,如快速排序或插入排序。对于小规模数据(如20个样本),插入排序是一个不错的选择,因为它简单且在小数据量时效率较高。
  2. 在滑动窗口更新时,每次都将数组整体后移一位,这会导致不必要的数据拷贝。可以通过使用环形缓冲区(circular buffer)来优化,这样只需要更新一个索引即可。
  3. 如果每次插入新样本后都进行排序,效率较低。可以考虑在每次插入新样本时,直接维护一个有序的数组,这样可以避免每次插入后重新排序。
  4. 浮点运算比整数运算慢,尤其是在嵌入式系统中。如果精度要求允许,可以考虑将温度数据转换为整数进行处理,最后再转换回浮点数。

总结

生成的代码在一定程度上能够满足我们提出的需求,可以根据自己的想法进一步提出优化方向,直到更符合我们实际需求。也可以在这个基础上根据我们的编码习惯进行更改。

展望

1. 进一步优化方向

  1. 算法优化:实现更高效的排序算法(如快速排序)和数据结构(如环形缓冲区)
  2. 性能优化:减少浮点运算,优化内存使用。
  3. 功能扩展:支持动态调整滤波器大小和去除最大/最小值的数量。

2. 技术趋势

  1. AI辅助开发:随着AI技术的发展,嵌入式开发将更多地依赖AI辅助工具,提升开发效率和代码质量。
  2. 实时性与可靠性:在嵌入式系统中,实时性和可靠性是关键。未来可以探索如何通过优化算法和硬件设计,进一步提升系统的实时性和稳定性。
  3. 跨平台支持:随着STM32等嵌入式平台的广泛应用,开发工具和算法需要支持多种硬件平台,提高代码的可移植性。

3. 应用场景

  1. 工业自动化:滑动滤波算法可用于工业传感器数据处理,提升信号的稳定性和可靠性。
  2. 智能家居:优化后的滤波算法可用于环境监测设备,如温度、湿度传感器。
  3. 医疗设备:在医疗监测设备中,实时、准确的数据处理至关重要,优化后的算法将发挥重要作用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek__1992

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值