OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5860|回复: 6

看到一段代码,求答疑解惑

[复制链接]

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
发表于 2022-7-21 14:53:24 | 显示全部楼层 |阅读模式
1金钱
u16 ADC_Buff[6];
void ADC_Fliter(int *sum_buf)
{
        u8 i,j;
        int FliterBuf[2][5],sum=0;
       
       
        for(i=0;i<5;i++){
                for(j=0;j<2;j++){
                        FliterBuf[j][i]=ADC_Buff[j];
                }
        }
       
        for(j=0;j<2;j++){
                sum=0;
                for(i=0;i<5;i++){
                        sum+=FliterBuf[j][i];
                }
                sum/=5;
                sum_buf[j]=sum;
        }
}
代码如上,请问函数实现了什么功能,以及i,j,FliterBuf的功能

慎独
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-7-21 15:26:38 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-7-21 15:31 编辑

这个就要一步一步去推敲了,比如赋值、for循环、加法、除法。
从过程上看有点像是求平均,但很奇怪结果又不像,奇怪的代码。是客户索要代码但是又不想让他看懂吗?
没理解错的话,整个函数等效于:
sum_buf[0]=ADC_Buff[0];sum_buf[1]=ADC_Buff[1];

专治疑难杂症
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-7-21 15:31:09 | 显示全部楼层
LcwSwust 发表于 2022-7-21 15:26
这个就要一步一步去推敲了,比如赋值、for循环、加法、除法。
从过程上看有点像是求平均,但很奇怪结果又 ...

我查了下,大概是ADC滤波,但是这个二维数组的作用,我一直看不明白,FliterBuf[j]=ADC_Buff[j];这一句也看不懂。
慎独
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-7-21 15:35:15 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-7-21 15:38 编辑
Amiao 发表于 2022-7-21 15:31
我查了下,大概是ADC滤波,但是这个二维数组的作用,我一直看不明白,FliterBuf[j]=ADC_Buff[j];这一句也 ...

可以对ADC_Buff[6]赋6个初值,然后调用一下这个函数,将结果发出来看它有没有作用,看是不是我猜的那样。
那个语句不就是赋值么。自己找纸笔画一画,把各个数组画出来,赋值就连线,或把值写出来。
专治疑难杂症
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-7-21 16:08:08 | 显示全部楼层

u16 ADC_Buff[6];//假设ADC_Buff={1,2,3,4,5,6}
void ADC_Fliter(int *sum_buf)
{
        u8 i,j;
        int FliterBuf[2][5],sum=0;//二维数组FliterBuf,2行5列
      
      
        for(i=0;i<5;i++)                        //列数移动
                for(j=0;j<2;j++){             //行数
                        FliterBuf[j]=ADC_Buff[j];//把ADC_Buff里面的第0个及第一个数据分别塞满FliterBuf,FliterBuf[0]里面就有{1,1,1,1,1},FliterBuf[1]里面就有[2,2,2,2,2]
                }
        }
      
        for(j=0;j<2;j++){
                sum=0;
                for(i=0;i<5;i++){
                        sum+=FliterBuf[j];//第一次把
FliterBuf[0]里面的5个1加起来,第二次FliterBuf[1]里面的5个2加起来
                }
                sum/=5;//再平均
                sum_buf[j]=sum;//再传递出去
        }
}
所以二楼说的是对的.
如果不是不想让别人看懂,就是想消耗点CPU时间.
还一个可能就是以为自己写了一个滤波函数,结果啥也不是
回复

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
发表于 2022-7-22 14:15:54 | 显示全部楼层
就是AD平均滤波程序,这个看不懂是因为弄了个二维数组
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-6-27
在线时间
15 小时
发表于 2022-7-22 17:30:17 | 显示全部楼层
如果它的第一个for循环中加了一行延时,然后ADC_Buff是在中断中更新的,那么就能理解了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-26 18:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表