• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

请问什么是中位值平均滤波法,用c怎么写

hangtao 2018-10-24 浏览量:2174
请问什么是中位值平均滤波法用c怎么写
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 中位值平均滤波法(又称防脉冲干扰平均滤波法)
    [pre lang="arduino" line="1"]/*
    A、名称:中位值平均滤波法(又称防脉冲干扰平均滤波法)
    B、方法:
        采一组队列去掉最大值和最小值后取平均值,
        相当于“中位值滤波法”+“算术平均滤波法”。
        连续采样N个数据,去掉一个最大值和一个最小值,
        然后计算N-2个数据的算术平均值。
        N值的选取:3-14。
    C、优点:
        融合了“中位值滤波法”+“算术平均滤波法”两种滤波法的优点。
        对于偶然出现的脉冲性干扰,可消除由其所引起的采样值偏差。
        对周期干扰有良好的抑制作用。
        平滑度高,适于高频振荡的系统。
    D、缺点:
        计算速度较慢,和算术平均滤波法一样。
        比较浪费RAM。
    E、整理:shenhaiyu 2013-11-01
    */
    
    int Filter_Value;
    
    void setup() {
      Serial.begin(9600);       // 初始化串口通信
      randomSeed(analogRead(0)); // 产生随机种子
    }
    
    void loop() {
      Filter_Value = Filter();       // 获得滤波器输出值
      Serial.println(Filter_Value); // 串口输出
      delay(50);
    }
    
    // 用于随机产生一个300左右的当前值
    int Get_AD() {
      return random(295 305);
    }
    
    // 中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法1)
    #define FILTER_N 100
    int Filter() {
      int i j;
      int filter_temp filter_sum = 0;
      int filter_buf[FILTER_N];
      for(i = 0; i < FILTER_N; i++) {
        filter_buf = Get_AD();
        delay(1);
      }
      // 采样值从小到大排列(冒泡法)
      for(j = 0; j < FILTER_N - 1; j++) {
        for(i = 0; i < FILTER_N - 1 - j; i++) {
          if(filter_buf > filter_buf[i + 1]) {
            filter_temp = filter_buf;
            filter_buf = filter_buf[i + 1];
            filter_buf[i + 1] = filter_temp;
          }
        }
      }
      // 去除最大最小极值后求平均
      for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf;
      return filter_sum / (FILTER_N - 2);
    }
    
    
    //  中位值平均滤波法(又称防脉冲干扰平均滤波法)(算法2)
    /*
    #define FILTER_N 100
    int Filter() {
      int i;
      int filter_sum = 0;
      int filter_max filter_min;
      int filter_buf[FILTER_N];
      for(i = 0; i < FILTER_N; i++) {
        filter_buf = Get_AD();
        delay(1);
      }
      filter_max = filter_buf[0];
      filter_min = filter_buf[0];
      filter_sum = filter_buf[0];
      for(i = FILTER_N - 1; i > 0; i--) {
        if(filter_buf > filter_max)
          filter_max=filter_buf;
        else if(filter_buf < filter_min)
          filter_min=filter_buf;
        filter_sum = filter_sum + filter_buf;
        filter_buf = filter_buf[i - 1];
      }
      i = FILTER_N - 2;
      filter_sum = filter_sum - filter_max - filter_min + i / 2; // +i/2 的目的是为了四舍五入
      filter_sum = filter_sum / i;
      return filter_sum;
    }*/[/pre]
    
    
    • 发布于 2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:15
  • #define N 12  
    
    char filter()  
    {  
    char countij;  
    char value_buf[N];  
    int sum=0;  
    for (count=0;count<N;count++)  
    {  
    value_buf[count] = get_ad();  
    delay();  
    }  
    for (j=0;j<N-1;j++)  
    {  
    for (i=0;i<N-j;i++)  
    {  
    if ( value_buf[i]>value_buf[i+1] )  
    {  
    temp = value_buf[i];  
    value_buf[i] = value_buf[i+1];  
    value_buf[i+1] = temp;  
    }  
    }  
    }  
    for(count=1;count<N-1;count++)  
    sum += value[count];  
    return (char)(sum/(N-2));  
    }  
    
    • 发布于2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0

  • C语言里有数组自动排序的函数。你把数据放入数组。然后排序后,提取中间值,就是该滤波方式,望采纳
    • 发布于2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以参考https://wenku.baidu.com/view/36e44f0103d8ce2f00662375.html
    • 发布于2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0

  •  中位值平均滤波法就是采集N次数据去掉最大最小值,剩余的数据进行算数平均。

    之类有一个本人在生产中用到的代码片段,可以参考。

     for(i=0;i<10;i++){

        BusAD=ADS_sum(ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);  //获取电压AD值
        BusAD>>=4;    //右移四位,减小精度,用不到这个高的精度,而且后几位可能不准确,同时保证累加值不会超限。
        TotalAD+=BusAD;
        if(i==0) {        //第一次采样,最大值和最小值赋值
          nMaxVal = BusAD;
          nMinVal = BusAD;
        }else {           //不是第一次采样,寻找最大值和最小值
          nMaxVal = BusAD>nMaxVal?BusAD:nMaxVal;
          nMinVal = BusAD<nMinVal?BusAD:nMinVal;
        }
      }
      BusAD=(TotalAD-nMaxVal-nMinVal)/8; //累计值减去最大和最小值 然后平均
    • 发布于2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 中位值平均滤波法原理是:在连续采集到的N个数据中,去掉最大值和最小值,剩下的N-2个数据求和再算平均,这个平均值作为采样值。

    看了这个应该就很清楚怎么做了,在N个数据中找到最大和最小,求个平均就行了。

    • 发布于2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0


  • 名称:中位值滤波法,十大经典滤波的其中一个
    方法:
        连续采样N次(N取奇数),把N次采样值按大小排列,
        取中间值为本次有效值。
    优点:
        能有效克服因偶然因素引起的波动干扰;
        对温度、液位的变化缓慢的被测参数有良好的滤波效果。
    缺点:
        对流量、速度等快速变化的参数不宜。

    int Filter_Value;
    void setup() {
      Serial.begin(9600);       // 初始化串口通信
      randomSeed(analogRead(0)); // 产生随机种子
    }
    void loop() {
      Filter_Value = Filter();       // 获得滤波器输出值
      Serial.println(Filter_Value); // 串口输出
      delay(50);
    }
    // 用于随机产生一个300左右的当前值
    int Get_AD() {
      return random(295 305);
    }
    // 中位值滤波法
    #define FILTER_N 101
    int Filter() {
      int filter_buf[FILTER_N];
      int i j;
      int filter_temp;
      for(i = 0; i < FILTER_N; i++) {
        filter_buf[i] = Get_AD();
        delay(1);
      }
      // 采样值从小到大排列(冒泡法)
      for(j = 0; j < FILTER_N - 1; j++) {
        for(i = 0; i < FILTER_N - 1 - j; i++) {
          if(filter_buf[i] > filter_buf[i + 1]) {
            filter_temp = filter_buf[i];
            filter_buf[i] = filter_buf[i + 1];
            filter_buf[i + 1] = filter_temp;
          }
        }
      }
      return filter_buf[(FILTER_N - 1) / 2];
    }

    • 发布于2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
    • 发布于2018-10-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 中位值平均滤波是很经典的一个滤波算法,原理倒不复杂,就是去掉一系列采样数据中的最大和最小值,剩下的数据求和再平均即可。
    • 发布于2018-10-25
    • 举报
    • 评论 0
    • 0
    • 0

  • 中值平均滤波就是在采集的N个数据中去掉一个最大值和一个最小值,然后对剩下的数据求平均值。所以这个算法不需要对数据排序关键是计算最大值,最小值,求和,然后计算平均值。网上代码比较多
    • 发布于2018-10-25
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个算法是将求得的一组N个数据去头去尾,再去掉最大值和最小值,最后对剩下的数据求平均值。

    • 发布于2018-10-28
    • 举报
    • 评论 0
    • 0
    • 0

  • ​这个就是去掉最大值和最小值,其他的数据求平均值就可以
    • 发布于2018-10-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 将连续采样得到的一组结果,分别去掉若干个最大值和若干个最小值,得到的就是中位数
    • 发布于2018-10-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 对一组数据进行排序(冒泡啊,啥的都可以),然后取中间一位
    • 发布于2018-11-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 对你的数据进行中值滤波,把数据全部按队列的方式求平均值
    • 发布于2018-11-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 中值平均滤波就是在采集的N个数据中去掉一个最大值和一个最小值,然后对剩下的数据求平均值。所以这个算法不需要对数据排序关键是计算最大值,最小值,求和,然后计算平均值。



    • 发布于2018-11-20
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

请问什么是中位值平均滤波法,用c怎么写