新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AD數據采集的“數字濾波”:10個“軟件濾波程序”

        AD數據采集的“數字濾波”:10個“軟件濾波程序”

        作者: 時間:2016-12-01 來源:網絡 收藏
        在AD采集中經常要用到數字濾波,而不同情況下又有不同的濾波需求,下面是10種經典的軟件濾波方法的程序和優缺點分析:

        1、限幅濾波法(又稱程序判斷濾波法)
        2、中位值濾波法
        3、算術平均濾波法
        4、遞推平均濾波法(又稱滑動平均濾波法)
        5、中位值平均濾波法(又稱防脈沖干擾平均濾波法)
        6、限幅平均濾波法
        7、一階滯后濾波法
        8、加權遞推平均濾波法
        9、消抖濾波法
        10、限幅消抖濾波法

        本文引用地址:http://www.104case.com/article/201612/324183.htm

        1、限副濾波

        A、方法:根據經驗判斷,確定兩次采樣允許的最大偏差值(設為A),每次檢測到新值時判斷:
        如果本次值與上次值之差<=A,則本次值有效
        如果本次值與上次值之差>A,則本次值無效,放棄本次值,用上次值代替本次值
        B、優點:能有效克服因偶然因素引起的脈沖干擾
        C、缺點:無法抑制那種周期性的干擾,平滑度差

        程序:

        /* A值可根據實際情況調整,value為有效值,new_value為當前采樣值,濾波程序返回有效的實際值 */

        #define A 10

        char value;

        char filter()
        {
        char new_value;
        new_value = get_ad();
        if ( ( new_value - value > A ) || ( value - new_value > A )
        return value;
        return new_value;
        }

        2、中位值濾波法
        A、方法:連續采樣N次(N取奇數),把N次采樣值按大小排列 ,取中間值為本次有效值
        B、優點:能有效克服因偶然因素引起的波動干擾,對溫度、液位的變化緩慢的被測參數有良好的濾波效果
        C、缺點:對流量、速度等快速變化的參數不宜

        程序:

        /* N值可根據實際情況調整
        排序采用冒泡法*/

        #define N 11

        char filter()
        {
        char value_buf[N];
        char count,i,j,temp;
        for ( count=0;count{
        value_buf[count] = get_ad();
        delay();
        }
        for (j=0;j{
        for (i=0;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;
        }
        }
        }
        return value_buf[(N-1)/2];
        }

        3、算術平均濾波法
        A、方法:連續取N個采樣值進行算術平均運算
        N值較大時:信號平滑度較高,但靈敏度較低
        N值較小時:信號平滑度較低,但靈敏度較高
        N值的選取:一般流量,N=12;壓力:N=4
        B、優點:適用于對一般具有隨機干擾的信號進行濾波
        這樣信號的特點是有一個平均值,信號在某一數值范圍附近上下波動
        C、缺點:對于測量速度較慢或要求數據計算速度較快的實時控制不適用比較浪費RAM

        程序:

        #define N 12

        char filter()
        {
        int sum = 0;
        for ( count=0;count{
        sum + = get_ad();
        delay();
        }
        return (char)(sum/N);
        }


        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安多县| 股票| 梨树县| 永川市| 平山县| 桦甸市| 桃园市| 宁晋县| 英德市| 张家口市| 深圳市| 福海县| 巫溪县| 灵台县| 桦川县| 万年县| 兖州市| 渝中区| 皋兰县| 崇文区| 东城区| 彩票| 定西市| 隆子县| 孝昌县| 莱州市| 双鸭山市| 肇州县| 绥德县| 玉溪市| 九江县| 清水县| 上林县| 大连市| 商南县| 兴安盟| 黄冈市| 德格县| 阜宁县| 金门县| 拉孜县|