wjdb3 发表于 2014-11-1 13:33:54

谢谢分享。。。

片羽之神 发表于 2014-11-1 13:40:19

10种简单的数字滤波算法(C语言源程序),学习了!mark

leo_advance 发表于 2014-11-1 14:01:35

谢谢楼主分享

xiaozhu2014 发表于 2014-12-17 17:21:56

必须顶起来的说。。。。

happyliu 发表于 2014-12-29 20:29:14

实践出真知,不同项目用过不少不同的滤波算法,稳定能用就好,有这些理解指导更好了 谢谢分享

jack5281206 发表于 2015-1-1 04:28:43

好東西!! 收下了~~~~~

kutf 发表于 2015-1-1 05:36:34

代码需要优化一下

am3359 发表于 2015-1-1 08:18:58

学习一下!

xiedeyong2008 发表于 2015-1-1 10:44:25

没有用过,还是要顶一下。需加强这方面知识

ghjstc 发表于 2015-1-1 17:23:32

一阶滞后滤波法

之前做一个东西显示电量的时候用过这种方式,终于知道这种滤波的名字了

ethan_free 发表于 2015-1-20 19:31:50

真是好资料,学习到了很多,顶

hanbing333444 发表于 2015-1-24 15:48:11

很实用,学习了,

sunday640 发表于 2015-1-27 13:21:34

说的挺好的。。 要是有fir 这么简单的教程就好了

levy 发表于 2015-1-27 13:24:08

收藏,学习了

peter_zj 发表于 2015-1-28 18:04:35

非常感谢!!!

0123456789 发表于 2015-1-28 19:40:57

记号 备用

chaojikoushuige 发表于 2015-1-28 21:39:53

我之前用的是平均值滤波,但是效果不是很好

lm4766 发表于 2015-1-28 21:49:35

受教了!!!

ruan18278816371 发表于 2015-7-11 09:14:01

我需要学习卡尔曼滤波{:lol:}

shouqiang_zhang 发表于 2015-7-11 21:11:33

学习了, 谢谢楼主.

Kwangsi 发表于 2015-7-27 09:26:25

本帖最后由 Kwangsi 于 2015-7-27 09:30 编辑

go2deathward 发表于 2014-4-8 14:01
呵呵,中位值滤波,为什么要排序?简单的东西,复杂化了。中位值无非就是去掉最大最小值而已,排序太麻烦了 ...

事实上 就算是你这个做法还有 很大的提升空间,

单片机本身资源就有限,而且很多情况下要求实时
如果按教科书的算法去做 那就该吃药了

Kwangsi 发表于 2015-8-10 11:39:05

贴一个我的代码给大家

电路有市电 过零点检测
每次过零 启动150us的 TIMER1_ISR 中断 在3750 us开始,每隔150us采集一次市电的 ADC 以检测用的市电是110v还是220V 同时检测一个0.1R的ADC ,市电的 ADC *16 /0.R的ADC 连续采样10次 去掉最大值和最小值。

void TIMER1_ISR (void) interrupt 3 //using 1
{
    //150us
    //GPIO2 ^= BIT3;//GPIO19
    //GPIO0 ^= BIT2;
    //++electrical_level_timer;//t2_count2
    switch(++electrical_level_timer)
    {
      case 1:
            TRIAC_OFF;//bidirectional triode thyristor
            break;

      case 24:
            electric_supply_0p1R_adc_max = 0x0000;
            electric_supply_0p1R_adc_min = 0xFFFF;
            electric_supply_0p1R_adc_sum = 0x0000;
            break;

      case 25://150*25=3750
      case 26://150*26=3900
      case 27://150*27=4050
      case 28://150*28=4200
      case 29://150*29=4350
      case 30://150*30=4500
      case 31://150*31=4650
      case 32://150*32=4800
      case 33://150*33=4950
            electric_supply_voltage_adc = ADC1_GetConversionValue(2);//adc 220v or 110v
            electric_supply_voltage_adc = (electric_supply_voltage_adc << 4);
            electric_0p1R_adc = ADC1_GetConversionValue(0);//0.1R
            electric_supply_0p1R_adc = (electric_supply_voltage_adc) / electric_0p1R_adc;

            if(electric_supply_0p1R_adc_max < electric_supply_0p1R_adc)
            {
                electric_supply_0p1R_adc_max = electric_supply_0p1R_adc;
            }
            else if(electric_supply_0p1R_adc_min > electric_supply_0p1R_adc)
            {
                electric_supply_0p1R_adc_min = electric_supply_0p1R_adc;
            }

            electric_supply_0p1R_adc_sum += electric_supply_0p1R_adc;
#if 0
            Debug_UartSendByte(0x55);
            Debug_UartSendByte(electric_supply_voltage_adc >> 8);
            Debug_UartSendByte((u8_t)electric_supply_voltage_adc);
            
            Debug_UartSendByte(0x56);
            Debug_UartSendByte(electric_0p1R_adc >> 8);
            Debug_UartSendByte((u8_t)electric_0p1R_adc);
#endif
            Debug_UartSendByte(0x5A);
            Debug_UartSendByte(electric_supply_0p1R_adc >> 8);
            Debug_UartSendByte((u8_t)electric_supply_0p1R_adc);

            Debug_UartSendByte(0xA5);
            Debug_UartSendByte(electric_supply_0p1R_adc_sum >> 8);
            Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_sum);
            break;

      case 34://150*34=5100us
            electric_supply_voltage_adc = ADC1_GetConversionValue(2);//adc 220v or 110v
            electric_supply_voltage_adc = (electric_supply_voltage_adc << 4);
            electric_0p1R_adc = ADC1_GetConversionValue(0);//0.1R
            electric_supply_0p1R_adc = (electric_supply_voltage_adc) / electric_0p1R_adc;

            if(electric_supply_0p1R_adc_max < electric_supply_0p1R_adc)
            {
                electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_min;
                electric_supply_0p1R_adc_max = electric_supply_0p1R_adc;
            }
            else if(electric_supply_0p1R_adc_min > electric_supply_0p1R_adc)
            {
                electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_max;
                electric_supply_0p1R_adc_min = electric_supply_0p1R_adc;
            }
            else
            {
                electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_min;
                electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_max;
                electric_supply_0p1R_adc_sum += electric_supply_0p1R_adc;
            }

            //3.3ms
                TF1 = 0;
            TR1 = 0;      //disable T1
            ET1 = 0;
            Debug_UartSendByte(0x5A);
            Debug_UartSendByte(electric_supply_0p1R_adc >> 8);
            Debug_UartSendByte((u8_t)electric_supply_0p1R_adc);

            Debug_UartSendByte(0xA5);
            Debug_UartSendByte(electric_supply_0p1R_adc_sum >> 8);
            Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_sum);
            
             Debug_UartSendByte(0x8A);
            Debug_UartSendByte(electric_supply_0p1R_adc_min >> 8);
            Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_min);
             Debug_UartSendByte(0x9A);
            Debug_UartSendByte(electric_supply_0p1R_adc_max >> 8);
            Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_max);
            Debug_UartSendByte(0xAA);
            Debug_UartSendByte(electric_supply_0p1R_adc_sum >> 8);
            Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_sum);
            
            electrical_level_timer = 0;
            break;

      default:
            break;


    }
}

纳什 发表于 2015-9-23 20:37:09

收藏了,慢慢消化

nuncle 发表于 2015-9-30 14:44:52

好东西 常用

YMC_TF 发表于 2015-10-1 13:37:50

总结的好好

liu615 发表于 2015-10-1 16:25:55

好东西,学些一下。

gxay2000 发表于 2015-10-28 21:36:52


收藏,谢谢分享

hello_sunny 发表于 2015-10-28 23:50:19

数字滤波很有用的,马克一下,谢谢

arvin_zhang 发表于 2016-2-26 20:40:23

MARKC语言滤波

xuebingsmart 发表于 2016-2-26 20:53:59

这个确实经典

my二月兰 发表于 2016-4-28 23:56:20

mark,多谢

vermon 发表于 2016-4-29 08:20:34

mark, 记下来

ackyee 发表于 2016-4-29 08:54:35

mark一下以后说不定有用

wushifeng 发表于 2016-6-17 13:47:07

mark         

zhuoguo518888 发表于 2016-6-25 07:15:29

谢谢楼主了


落草火子 发表于 2017-1-8 23:44:40

不错,收藏了1

xh007xh007 发表于 2017-1-9 00:50:54

做个记号,明天电脑上再仔细看

KevinDeng 发表于 2017-1-9 13:08:03

这个是在‘程序匠人"写的一本书里看到多,网上也到处都是。

闪耀的空白 发表于 2017-1-11 20:35:41

不错的资料,多谢分享

LO单片机VE 发表于 2017-2-24 10:30:19

中位值平均滤波法运算中有一处问题:

/********************************************
说明:采一组队列去掉最大值和最小值
优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消
除有其引起的采样值偏差。对周期干扰有良好的抑制作用,
平滑度高,适于高频振荡的系统。
缺点:测量速度慢
*********************************************/

#define N 12

uchar filter()

{
unsigned char i,j,k,l;
unsigned char temp,sum=0,value;
unsigned char value_buf,;

for(i=0;i<N;i++)
{
value_buf = get_ad();
delay();
}
//采样值从小到大排列(冒泡法)
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
应该改成for(i=0;i<(N-1-j);i++)
{
if(value_buf>value_buf)
{
temp = value_buf;
value_buf = value_buf;
value_buf = temp;
}
}
}

for(i=1;i<N-1;i++)
sum += value_buf;

value = sum/(N-2);
return(value);
}

hellohaitong 发表于 2017-2-24 11:02:32

收藏备用,数字滤波

kingbo 发表于 2017-2-25 19:21:24

如此强大,可惜我看不懂@

kiwil 发表于 2017-3-2 19:14:07

有2种方法用过了

happy_andy 发表于 2017-3-31 18:27:49

mark下,需要实践测试验证下

lys13305733825 发表于 2017-12-6 10:48:51

122楼的代码写的真好.顶!

liyanfeng 发表于 2017-12-7 17:37:36

谢了,学习

xaviersw 发表于 2020-12-14 21:06:04

实用,作个记号

zh1012 发表于 2020-12-15 08:32:23

收藏了,谢谢分享

xianqq 发表于 2021-6-16 13:47:15

学习收藏,谢谢

saf999 发表于 2021-11-29 11:01:02

谢谢各位分享,正需要。现在学习51ADC
页: 1 [2]
查看完整版本: 10种简单的数字滤波算法(C语言源程序)