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进行后续处理,如显示、控制等
}
}
说明
- 数据存储: temperature_samples 数组用于存储滑动窗口内的温度采样值, sample_count 记录当前采样个数。
- 排序算法:使用冒泡排序对采样值进行排序,以便去掉最大值和最小值。
- 滤波逻辑:• 当采样个数小于滤波器大小时,直接计算平均值。• 当采样个数达到滤波器大小时,去掉2个最大值和2个最小值后计算平均值。
- 主程序调用:在主程序中定期获取新的温度采样值,并调用 sliding_filter 函数进行滤波处理。
优化提问
如何进一步优化
优化建议
在上述代码的基础上,可以通过以下几种方式进一步优化代码的性能和可读性:
- 优化排序算法冒泡排序的时间复杂度为O(n²),效率较低。可以改用更高效的排序算法,如快速排序或插入排序。对于小规模数据(如20个样本),插入排序是一个不错的选择,因为它简单且在小数据量时效率较高。
- 在滑动窗口更新时,每次都将数组整体后移一位,这会导致不必要的数据拷贝。可以通过使用环形缓冲区(circular buffer)来优化,这样只需要更新一个索引即可。
- 如果每次插入新样本后都进行排序,效率较低。可以考虑在每次插入新样本时,直接维护一个有序的数组,这样可以避免每次插入后重新排序。
- 浮点运算比整数运算慢,尤其是在嵌入式系统中。如果精度要求允许,可以考虑将温度数据转换为整数进行处理,最后再转换回浮点数。
总结
生成的代码在一定程度上能够满足我们提出的需求,可以根据自己的想法进一步提出优化方向,直到更符合我们实际需求。也可以在这个基础上根据我们的编码习惯进行更改。
展望
1. 进一步优化方向
- 算法优化:实现更高效的排序算法(如快速排序)和数据结构(如环形缓冲区)
- 性能优化:减少浮点运算,优化内存使用。
- 功能扩展:支持动态调整滤波器大小和去除最大/最小值的数量。
2. 技术趋势
- AI辅助开发:随着AI技术的发展,嵌入式开发将更多地依赖AI辅助工具,提升开发效率和代码质量。
- 实时性与可靠性:在嵌入式系统中,实时性和可靠性是关键。未来可以探索如何通过优化算法和硬件设计,进一步提升系统的实时性和稳定性。
- 跨平台支持:随着STM32等嵌入式平台的广泛应用,开发工具和算法需要支持多种硬件平台,提高代码的可移植性。
3. 应用场景
- 工业自动化:滑动滤波算法可用于工业传感器数据处理,提升信号的稳定性和可靠性。
- 智能家居:优化后的滤波算法可用于环境监测设备,如温度、湿度传感器。
- 医疗设备:在医疗监测设备中,实时、准确的数据处理至关重要,优化后的算法将发挥重要作用。