怎样用C语言怎么用excel求平均数数

查看: 300|回复: 24
关于C语言求平均数的问题,求C语言高手指点
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
因为ADC采样的数据是有抖动的,我用求平均数来滤波以得到一个稳定的值,将ADC读到的值的放在数组中,然后对数组求平均值。
常规的求平均数的方法是 (a+b+c)/3,比如采集到的数是4,5,6,那么均值就是(4+5+6)/3=5,
现在问题来了,因为传感器的原因,假如真实值是0,那么采样到的值就有可能在0左右波动, 有可能是1,2,也有可能是补码0xff,0xfe,
那么这时求得的平均数就有可能是 (1+0xfe+2)=85,得出的结果就有问题了。
虽然这问题比较简单,不过想了好久也没想到一个高效方法,不知道有没有C语言高手能提供一下思路。
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
其实是一个角度传感器,如果是用12位的ADC来读取,在0°的时候值就可能是1,2,3,也有可能是0xfff,0xffe
主题帖子精华
在线时间1018 小时
既然你知道有正负,还当ff fe处理?
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
既然你知道有正负,还当ff fe处理?
采集到的值是无符号的,我想过转换成有符号的整型,但是在正负交界的地方依旧存在这个问题,比如传感器180°的时候,-127和127的均值就是0了
主题帖子精华
在线时间1018 小时
采集到的值是无符号的,我想过转换成有符号的整型,但是在正负交界的地方依旧存在这个问题,比如传感器18 ...
不知道你的什么传感器,如果结果有正负,传出的却只有正,那你的传感器及测量方法比较扯淡
道不同,不相与为谋
主题帖子精华
金牌会员, 积分 2606, 距离下一级还需 394 积分
在线时间549 小时
我就问你一个问题:你如何定义一个8位的负数?
主题帖子精华
金牌会员, 积分 1821, 距离下一级还需 1179 积分
在线时间386 小时
先判断数的±嘛,如果数大于等于0x80,则判断为负数,然后进行处理,这样应该能解决你的问题 吧
把复杂的事,做简单!
主题帖子精华
金牌会员, 积分 1046, 距离下一级还需 1954 积分
在线时间158 小时
本帖最后由 d1z1y2 于
23:19 编辑
ADC 的值为0时对应电压为0V,4095时是3.3V(假设参考电压是3.3V),那楼主的意思是说传感器输出的电压一会儿0V,一会儿3.3V?
楼主,ADC的值表示的是其Pin脚上的电压值的数字量,电压值……
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
ADC 的值为0时对应电压为0V,4095时是3.3V(假设参考电压是3.3V),那楼主的意思是说传感器输出的电压一会儿0 ...
是这样的,就像角度,359°和1°,按照常规求平均数的话,结果就是(359+1)/2=180°了
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
我就问你一个问题:你如何定义一个8位的负数?
是无符号的整型,可以用强制转换(int)的方法转成带符号的整型
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
不知道你的什么传感器,如果结果有正负,传出的却只有正,那你的传感器及测量方法比较扯淡
就是角度的传感器,采样的时候是无符号整型,比如359°和1°,按照常规求平均数的话,结果就是(359+1)/2=180°了
主题帖子精华
金牌会员, 积分 2606, 距离下一级还需 394 积分
在线时间549 小时
就是角度的传感器,采样的时候是无符号整型,比如359°和1°,按照常规求平均数的话,结果就是(359+1)/2= ...
我说一个最笨的办法:制作一个表,每个角度对应一个无符号数,或者每一个无符号数对应一个角度(float),
求平均值之前,先把采集的无符号数转换成角度(float),然后对角度求平均。
实际上我用过模拟的角度仪,采集区间对应±46度(超过此区间,角度仪线性不好),输出模拟量,使用12位AD采集,采集结果是无符号的0-4096,对应-46~46度。不管是直接对无符号求均值,还是对转换了的角度求均值,都是没问题的。
主题帖子精华
中级会员, 积分 334, 距离下一级还需 166 积分
在线时间142 小时
你们是自己做的传感器还是外边买的?
正常的模拟接口的角度传感器,正转和反转的输出电压绝对不一样,线性的纯模拟电路,当输入量只是微小变动时,输出电压是没办法跳变的。模拟电路只会饱和,不会溢出归零。所以挺好奇这个传感器从哪来的。
你要是量程用满360°,还不如换成绝对编码器,数字接口的。既然你之前用了12位ADC,看起来精度需求也不是很大,也选12位的编码器就够,不是很贵。担心有0点溢出的问题可以选多圈编码器,截取中间的360°使用。
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
你们是自己做的传感器还是外边买的?
正常的模拟接口的角度传感器,正转和反转的输出电压绝对不一样,线性 ...
现在就是用的绝对值编码器,0~360°模拟输出,我是用adc来采集的,问题就是在0°左右求平均值,得出的结果是180°左右的
主题帖子精华
中级会员, 积分 245, 距离下一级还需 255 积分
在线时间44 小时
这个问题的本质是,角度是一个圆形每圈都会复位的变量,而ADC的值是一个线性增长的变量。你可以把多圈信息也记录一下,这样就是359,360,361,平均的结果,再除以360取余数就可以了。等过了0度比如超过了60度,就可以把多圈信息清零,重新记录,以免多圈信息溢出。
主题帖子精华
中级会员, 积分 245, 距离下一级还需 255 积分
在线时间44 小时
这个问题的本质是,角度是一个圆形每圈都会复位的变量,而ADC的值是一个线性增长的变量。你可以把多圈信息 ...
采样得数据做一个微分,就是后一个减前一个绝对值,如果大于你的最大采样时间乘以角速度的值的1.5倍,就做过零点的判断。
主题帖子精华
中级会员, 积分 324, 距离下一级还需 176 积分
在线时间84 小时
本帖最后由 bootblack 于
09:10 编辑
参数解决办法如下:
x = (int)(((a+b+c)%256) - 256)
&1& == 0&&正好 &2& == -x 左偏
&3& == +x&&右偏
主题帖子精华
中级会员, 积分 334, 距离下一级还需 166 积分
在线时间142 小时
现在就是用的绝对值编码器,0~360°模拟输出,我是用adc来采集的,问题就是在0°左右求平均值,得出的结 ...
这个编码器是你自己选的吗?不太理解为什么要用模拟接口的。码盘采集来的信号已经是数字信号了,何必还要加个DA转换成模拟信号输出呢?数字接口传过来就能直接读数据,比ADC快,抗干扰性还好,有的编码器还自带奇偶校验。
非要用模拟接口的,可以 选个多圈的,比如2圈(-360~+360),把其中-180~+180作为有效量程,能避开溢出归零的问题。
如果你不是用满整个360°,而是只使用一部分,比如0~180°,可以把角度从0~360映射到-90~270(就是说假如a&=270,a=a-360),也可以避开溢出归零。
如果你要用满360°,不换器件肯定不行。
主题帖子精华
初级会员, 积分 80, 距离下一级还需 120 积分
在线时间30 小时
你是说如果采集到0xfe,那就有可能变得很大吗?你没有理解数据类型的意义呀。你的1+0xfe,如果这个采集变量是定义成有符号数,那结果也是负的呀(-1),而不是无符号的255,如果1+0xfe+2,那就等于1了。
主题帖子精华
初级会员, 积分 80, 距离下一级还需 120 积分
在线时间30 小时
所以,关键的地方就是,如果你确定采集到的AD值会出现负的,那就吧变量定义成有符号的,这样不管加减乘除,算出来也是有符号的。
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
可能我的问题表达不是很清楚,我科学上网在google终于找到了一篇专利文档,可以很好的说明了这个问题。不过是国内的专利,不知为啥国内搜不到,出口转内销了
12:27 上传
点击文件名下载附件
475.72 KB, 下载次数: 8
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间25 小时
还有两篇日文的日志,也对这一问题提出了方法。
一种是通过三角函数转变成空间矢量
一种是对数据进行处理后计算平均值
主题帖子精华
初级会员, 积分 162, 距离下一级还需 38 积分
在线时间20 小时
楼主的问题跟角度平均值不是同样的问题。
关于温度补码,要先求出实际温度,在做四则运算求平均值。
但是角度问题,是有预置条件的。比如说,0和180度的平均值,是多少?90还是270?必须要定好这些模糊不清的边界。
主题帖子精华
中级会员, 积分 309, 距离下一级还需 191 积分
在线时间52 小时
多采样几个,排序回把最大、最小的去掉,再平均
主题帖子精华
高级会员, 积分 506, 距离下一级还需 494 积分
在线时间61 小时
是一直采样还是偶尔采一次样?
是前者的话可以判断方向,然后再预测下下次的数据大小,在进行滤波时做一个动态的处理就可以。
如果是偶尔采样,那采用算法的意义就不大了,到了0度附近你就无法判断究竟是355度还是1度了,因为没有方向,无法判断。
Powered byc语言:不使用(a+b)/2这种方式,求两个数的平均值。
#include&stdio.h&
int main()
int avg = 0;
scanf(&%d%d&, &a, &b);
avg = (a + b) && 1;
//右移一位相当于除以2
printf(&%d\n&,avg);19:54 提问
谢谢大家了
这怎么回事啊
void main()
int a,b,c,
printf("请输入员工的工资:");
scanf("%d%d%d",&a,&b,&c);
printf("他们的平均工资为:\n");
printf("(a+b+c)/3=%d\n",salary);
if(a&salary)
printf("%d\n",a);
else if(b&salary)
printf("%d\n",b);
else if(c&salary)
printf("%d\n",c);
printf("未达到平均工资\n");
输入三个工资,计算平均工资,然后再输入一个员工的工资,
判断该员工的工资是否满足平均工资。满足就输出员工工资,不满足则输出“未达到平均工资”
谢谢大家!
按赞数排序
代码有两个明显的错误,一个是
缺少salary = (a + b + c) / 3;,没有计算平均工资。
一个是后面的条件判断else if这个else画蛇添足。
因为如果a的工资大于平均工资,那么后面的循环走不到。
salary你没有赋值,直接输出啊。
应该要这样写:printf("(a+b+c)/3=%d\n",(a+b+c)/3);
salary = (a + b + c) / 3;
printf("(a+b+c)/3=%d\n",salary);
void main()
int a,b,c,
printf("请输入员工的工资:");
scanf("%d%d%d",&a,&b,&c);
printf("他们的平均工资为:\n");
//下面是计算的三个员工的平均工资并输出
salary = (a+b+c)/3;
printf("三个员工的平均工资为\n",salary);
//输入另外一个员工的工资
printf("输入另外一个员工的工资");
scanf("%d", &othersalary);
if (otersalary & salary)
printf("另外一个员工的工资为%d", otersalary);
printf("你输入的不到平均工资");
麻烦采纳我的为满意答案,谢谢
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐c语言 求平均数有什么函数?_百度知道
c语言 求平均数有什么函数?
我有更好的答案
C语言中,并没有专门的求平均数函数。一般都是根据需要自行编写。一、算法设计:平均数需要先计算一组数的总和,然后除以总个数。所以需要按照如下步骤进行:1、确认元素个数及各个元素值;2、遍历,累加各个元素;3、除以个数,得到平均数;4、输出结果。二、参考代码:以整型为例:#include&&stdio.h&float&ave(int&*a,&int&n){&&&&float&s=0;&&&&int&i;&&&&for(i=0;i&n;i++)//遍历。&&&&&&&&s+=a[i];//累加。&&&&s/=n;//计算平均数。&&&&return&s;//返回结果。}int&main(){&&&&int&a[5]&=&{2,6,8,9,3};//待计算数组。&&&&printf(&%f\n&,&ave(a,5));//调用函数,计算平均数并输出。&&&&&return&0;}注意:由于平均数涉及除法,所以一般平均数值并不是整数,所以需要用浮点数来存储平均数。&
软件工程师
库函数里没有求平均数的函数,都是自己定义一个求平均数的函数,而且实际编写中都是按项目要求来编写的。一楼已经定义了一个,可以参考借鉴。
math.h里面似乎没有,要自己定义!
sum=a1+a2+a3+········+anb=sum/n
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。输入任意三个整数,求它们的和及平均值 用C语言编写程序
#include“stdio.h"void main(){\x09int a,b,c,\x09
scanf("%d %d %d",&a,&b,&c);
sum=a+b+c;\x09ave=(a+b+c)/3.0;printf("三个数的和为: %d\n",sum);printf("三个数的平均值为: %f\n",ave);}
已知a是方程x2-x-1=0的一个根,则a4-3a-2的值为______.
把x=a代入方程可得,a2-a-1=0,即a2=a+1,∴a4-3a-2=(a2)2-3a-2=(a+1)2-3a-2=a2-a-1=0.
已知函数f(x)=x?+2ax,x属于[-5,5]
用【高中数学】知识求导函数的原函数,F’(x)=根号下(4-x^2),求F(x)请用【高中】数学知识,详细解释一下.不定积分高中没有学
该题是要求不定积分,不定积分是高中数学内容.F(x)=∫F'(x)dx=∫√(4-x^2)dx=2∫√[1-(x/2)^2]dx|x/2|≤1,令sint=x/2,则x=2sintF(x)=2∫√(1-sint^2)d(2sint)=4∫cost^2dt=4∫costd(sint)=4costsint-4∫sintd(cost)=4costsint+4∫sint^2dt=4costsint+4∫(1-cost^2)dt=4costsint+4t-4∫cost^2dt=4costsint+4t-F(x)F(x)=2costsint+2t+C=sin2t+2t+C=sin[2arcsin(x/2)]+2arcsin(x/2)+C
其他相关问题

我要回帖

更多关于 怎样用excel求平均数 的文章

 

随机推荐