0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

常用的ADC濾波算法有哪些

CHANBAEK ? 來源:網(wǎng)絡(luò)整理 ? 2024-10-08 14:35 ? 次閱讀

ADC模數(shù)轉(zhuǎn)換器)濾波算法信號處理中起著至關(guān)重要的作用,它們能夠幫助我們提取出有用的信號,同時(shí)濾除噪聲和干擾。以下是常用的ADC濾波算法詳解,這些算法各具特色,適用于不同的應(yīng)用場景。

一、限幅濾波法(又稱程序判斷濾波法)

1. 方法

根據(jù)經(jīng)驗(yàn)判斷,確定兩次采樣允許的最大偏差值(設(shè)為A)。每次檢測到新值時(shí)判斷:如果本次值與上次值之差小于等于A,則本次值有效;如果本次值與上次值之差大于A,則本次值無效,放棄本次值,用上次值代替本次值。

2. 優(yōu)點(diǎn)

  • 能有效克服因偶然因素引起的脈沖干擾。

3. 缺點(diǎn)

  • 無法抑制周期性干擾,平滑度差。

4. 示例程序

#define A 10  
char value;  
char filter() {  
    char new_value;  
    new_value = get_ad(); // 獲取采樣值  
    if (abs(new_value - value) > A)  
        return value; // abs()取絕對值函數(shù)  
    return new_value;  
}

二、中位值濾波法

1. 方法

連續(xù)采樣N次(N取奇數(shù)),把N次采樣值按大小排列,取中間值為本次有效值。

2. 優(yōu)點(diǎn)

  • 能有效克服因偶然因素引起的波動干擾。
  • 對溫度、液位等變化緩慢的被測參數(shù)有良好的濾波效果。

3. 缺點(diǎn)

  • 對流量、速度等快速變化的參數(shù)不宜使用。

4. 示例程序

#define N 11  
char filter() {  
    char value_buf[N];  
    char count, i, j, temp;  
    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;  
            }  
        }  
    }  
    return value_buf[(N - 1) / 2];  
}

三、算術(shù)平均濾波法

1. 方法

連續(xù)取N個(gè)采樣值進(jìn)行算術(shù)平均運(yùn)算。N值較大時(shí),信號平滑度較高,但靈敏度較低;N值較小時(shí),信號平滑度較低,但靈敏度較高。N值的選取通常根據(jù)被測參數(shù)的特性來確定,如一般流量N=12,壓力N=4。

2. 優(yōu)點(diǎn)

  • 適用于對一般具有隨機(jī)干擾的信號進(jìn)行濾波。這類信號的特點(diǎn)是有一個(gè)平均值,信號在某一數(shù)值范圍附近上下波動。

3. 缺點(diǎn)

  • 對于測量速度較慢或要求數(shù)據(jù)計(jì)算速度較快的實(shí)時(shí)控制不適用。
  • 比較浪費(fèi)RAM。

4. 示例程序

#define N 12  
char filter() {  
    int sum = 0;  
    for (count = 0; count < N; count++) {  
        sum += get_ad();  
    }  
    return (char)(sum / N);  
}

四、遞推平均濾波法(又稱滑動平均濾波法)

1. 方法

把連續(xù)取N個(gè)采樣值看成一個(gè)隊(duì)列。隊(duì)列的長度固定為N,每次采樣到一個(gè)新數(shù)據(jù)放入隊(duì)尾,并扔掉原來隊(duì)首的一次數(shù)據(jù)(先進(jìn)先出原則)。把隊(duì)列中的N個(gè)數(shù)據(jù)進(jìn)行算術(shù)平均運(yùn)算,就可獲得新的濾波結(jié)果。N值的選取同樣根據(jù)被測參數(shù)的特性來確定,如流量N=12,壓力N=4,液面N=4~12,溫度N=1~4。

2. 優(yōu)點(diǎn)

  • 對周期性干擾有良好的抑制作用,平滑度高。
  • 適用于高頻振蕩的系統(tǒng)。

3. 缺點(diǎn)

  • 靈敏度低。
  • 對偶然出現(xiàn)的脈沖性干擾的抑制作用較差,不易消除由于脈沖干擾所引起的采樣值偏差。
  • 不適用于脈沖干擾比較嚴(yán)重的場合。
  • 比較浪費(fèi)RAM。

4. 示例程序 (注意:此示例程序與上述示例有所不同,但原理相同)

#define N 12  
char filter() {  
    int sum = 0;  
    for (count = 0; count < N; count++) {  
        sum += get_ad();  
    }  
    return (char)(sum / N);  
}

五、中位值平均濾波法(又稱防脈沖干擾平均濾波法)

1. 方法

相當(dāng)于“中位值濾波法”+“算術(shù)平均濾波法”。連續(xù)采樣N個(gè)數(shù)據(jù),去掉一個(gè)最大值和一個(gè)最小值,然后計(jì)算N-2個(gè)數(shù)據(jù)的算術(shù)平均值。N值的選取通常為3~14。

2. 優(yōu)點(diǎn)

  • 融合了兩種濾波法的優(yōu)點(diǎn)。
  • 對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差。

3. 缺點(diǎn)

  • 測量速度較慢。
  • 比較浪費(fèi)RAM。

4. 示例程序 (注意:此示例程序?yàn)楹喕?,未包含所有?xì)節(jié))

#define N 12  
char value_buf[N];  
char i = 0;  
char filter() {  
    char count;  
    int sum = 0;  
    value_buf[i++] = get_ad();  
    if (i == N)  
        i = 0;  
    for (count = 0; count < N; count++) {  
        sum += value_buf[count];  
    }  
    return (char)(sum / N);  
}

六、限幅平均濾波法

1. 方法

相當(dāng)于“限幅濾波法”+“遞推平均濾波法”。每次采樣到的新數(shù)據(jù)先進(jìn)行限幅處理,再送入隊(duì)列進(jìn)行遞推平均濾波處理。

2. 優(yōu)點(diǎn)

  • 融合了兩種濾波法的優(yōu)點(diǎn)。
  • 對于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差。

3. 缺點(diǎn)

  • 比較浪費(fèi)RAM。

4. 示例程序 (注意:此示例程序結(jié)合了限幅和遞推平均濾波的特點(diǎn))

#define A 10  
#define N 12  
char value, i = 0;  
char value_buf[N];  
char filter() {  
    char new_value, sum = 0;  
    new_value = get_ad();  
    if (abs(new_value - value) < A) {  
        value_buf[i++] = new_value;  
        if (i == N)  
            i = 0;  
        for (count = 0; count < N; count++) {  
            sum += value_buf[count];  
        }  
        return (char)(sum / N);  
    } else {  
        return value; // 或者使用其他處理方式,如返回上次有效值等  
    }  
}  
// 注意:此示例程序中的“value”變量需要在外部進(jìn)行初始化和更新,以確保其有效性。同時(shí),為了簡化代碼,未包含所有錯(cuò)誤處理和邊界檢查。

七、一階滯后濾波法

1. 方法

取a=0~1,本次濾波結(jié)果=(1-a)×本次采樣值+a×上次濾波結(jié)果。

2. 優(yōu)點(diǎn)

  • 對周期性干擾具有良好的抑制作用。
  • 適用于波動頻率較高的場合。

3. 缺點(diǎn)

  • 相位滯后,靈敏度低。滯后程度取決于a值大小。
  • 不能消除濾波頻率高于采樣頻率的1/2的干擾信號。

4. 示例程序 (注意:此示例程序中的a值可以根據(jù)需要進(jìn)行調(diào)整)

#define a 30 // 取0~100之間的值進(jìn)行換算,如a=30表示0.3的系數(shù)  
char value;  
char filter() {  
    char new_value;  
    new
#define a 30 // 取0~100之間的值進(jìn)行換算,如a=30表示0.3的系數(shù)  
char value; // 上次濾波結(jié)果,需要在外部進(jìn)行初始化和更新  
char filter() {  
    char new_value = get_ad(); // 本次采樣值  
    value = (100 - a) * new_value / 100 + a * value / 100; // 按照公式進(jìn)行計(jì)算,注意這里將a換算為了百分比形式  
    // 或者等價(jià)地寫作:value = new_value * (1 - a/100) + value * (a/100);  
    return value;  
}

注意

  • 在實(shí)際使用中,a的值通常需要根據(jù)具體情況進(jìn)行調(diào)整,以達(dá)到最佳的濾波效果。
  • 一階滯后濾波法雖然能夠抑制周期性干擾,但會引起相位滯后,這在某些對實(shí)時(shí)性要求較高的應(yīng)用中可能是一個(gè)缺點(diǎn)。

八、加權(quán)遞推平均濾波法

1. 方法

對連續(xù)N個(gè)采樣值,分別乘以不同的加權(quán)系數(shù),然后進(jìn)行算術(shù)平均運(yùn)算。各加權(quán)系數(shù)的取值通常根據(jù)被測參數(shù)的特性來確定,如流量測量中的加權(quán)系數(shù)可以設(shè)為中間大兩頭小,即越接近當(dāng)前時(shí)刻的采樣值,其加權(quán)系數(shù)越大。

2. 優(yōu)點(diǎn)

  • 能夠更靈活地適應(yīng)被測參數(shù)的變化特性。
  • 通過選擇合適的加權(quán)系數(shù),可以優(yōu)化濾波效果。

3. 缺點(diǎn)

  • 加權(quán)系數(shù)的選擇需要一定的經(jīng)驗(yàn)和試驗(yàn)。
  • 計(jì)算量相對較大,可能影響實(shí)時(shí)性。

4. 示例程序 (注意:此示例程序?yàn)楹喕?,未包含所有?xì)節(jié)和加權(quán)系數(shù)的具體選擇)

#define N 5  
char value_buf[N];  
int weight[N] = {1, 2, 3, 2, 1}; // 示例加權(quán)系數(shù),可以根據(jù)需要調(diào)整  
char i = 0;  
char filter() {  
    char count;  
    int sum = 0, weighted_sum = 0;  
    value_buf[i++] = get_ad();  
    if (i == N)  
        i = 0;  
    for (count = 0; count < N; count++) {  
        sum += value_buf[count];  
        weighted_sum += value_buf[count] * weight[count];  
    }  
    // 可以選擇返回算術(shù)平均值或加權(quán)平均值  
    // return (char)(sum / N); // 算術(shù)平均值  
    return (char)(weighted_sum / (weight[0] + weight[1] + weight[2] + weight[3] + weight[4])); // 加權(quán)平均值  
}

九、消抖濾波法

1. 方法

設(shè)置一個(gè)濾波計(jì)數(shù)器,將每次采樣值與當(dāng)前有效值進(jìn)行比較。如果采樣值與當(dāng)前有效值相等,則計(jì)數(shù)器清零;如果采樣值與當(dāng)前有效值不相等,則計(jì)數(shù)器加1。當(dāng)計(jì)數(shù)器達(dá)到預(yù)設(shè)的上限值(如5次)時(shí),本次采樣值被認(rèn)定為有效值,并用其更新當(dāng)前有效值。

2. 優(yōu)點(diǎn)

  • 能夠有效消除因按鍵抖動或傳感器不穩(wěn)定引起的誤判。

3. 缺點(diǎn)

  • 對于快速變化的信號可能不適用。
  • 濾波計(jì)數(shù)器上限值的選擇需要一定的經(jīng)驗(yàn)和試驗(yàn)。

4. 示例程序 (注意:此示例程序以按鍵消抖為例)

#define FILTER_THRESHOLD 5 // 濾波計(jì)數(shù)器上限值  
char current_value = 0; // 當(dāng)前有效值  
unsigned char filter_counter = 0; // 濾波計(jì)數(shù)器  
  
char filter(char new_value) {  
    if (new_value == current_value) {  
        filter_counter = 0; // 采樣值與當(dāng)前有效值相等,計(jì)數(shù)器清零  
    } else {  
        filter_counter++; // 采樣值與當(dāng)前有效值不相等,計(jì)數(shù)器加1  
        if (filter_counter >= FILTER_THRESHOLD) {  
            current_value = new_value; // 計(jì)數(shù)器達(dá)到上限值,更新當(dāng)前有效值  
            filter_counter = 0; // 計(jì)數(shù)器清零  
        }  
    }  
    return current_value;  
}

總結(jié)

以上介紹了九種常用的ADC濾波算法,每種算法都有其特點(diǎn)和適用場景。在實(shí)際應(yīng)用中,需要根據(jù)被測參數(shù)的特性、采樣頻率、實(shí)時(shí)性要求以及系統(tǒng)資源等因素綜合考慮,選擇最合適的濾波算法。同時(shí),也需要注意濾波算法可能帶來的相位滯后、靈敏度降低等副作用,并采取相應(yīng)的措施進(jìn)行優(yōu)化。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6402

    瀏覽量

    543849
  • 模數(shù)轉(zhuǎn)換器

    關(guān)注

    26

    文章

    3109

    瀏覽量

    126705
  • 濾波算法
    +關(guān)注

    關(guān)注

    2

    文章

    88

    瀏覽量

    13705
收藏 人收藏

    評論

    相關(guān)推薦

    STM32的ADC項(xiàng)目應(yīng)用,用什么算法濾波和穩(wěn)定數(shù)據(jù)抖動?

    STM32的ADC項(xiàng)目應(yīng)用,大家都用什么算法濾波和穩(wěn)定數(shù)據(jù)抖動。 ADC數(shù)據(jù)的抖動有時(shí)候應(yīng)用在項(xiàng)目上讓人很是頭疼,什么度娘十大濾波
    發(fā)表于 04-17 08:20

    常用的經(jīng)典濾波算法哪些??

    常用的經(jīng)典濾波算法哪些??
    發(fā)表于 07-01 15:15

    AD轉(zhuǎn)換常用濾波算法

    非常經(jīng)典的濾波算法!
    發(fā)表于 05-05 14:29

    AD轉(zhuǎn)換常用濾波算法

    AD轉(zhuǎn)換常用濾波算法
    發(fā)表于 08-01 10:46

    介紹幾種嵌入式常用濾波算法的matlab實(shí)現(xiàn)

    隨著基于模型設(shè)計(jì)的廣泛應(yīng)用,模型在環(huán)仿真也逐漸多了起來,我們今天介紹幾種嵌入式常用濾波算法的matlab實(shí)現(xiàn)。一、采用數(shù)字濾波算法克服隨機(jī)干
    發(fā)表于 12-21 08:32

    分享幾種較簡單而常用濾波算法

    在單片機(jī)開發(fā)中,經(jīng)常需要對輸入的數(shù)據(jù)進(jìn)行過濾處理,如傳感器數(shù)據(jù)輸出,AD采樣等,合適的濾波處理能達(dá)到更好效果。下面分享幾種較簡單而常用濾波算法:文章目錄@[toc]一、限幅
    發(fā)表于 12-21 06:10

    什么現(xiàn)成的濾波算法來消除ADC采集溫度的波動呢

    圖上是adc采集多組原始數(shù)據(jù)的平均值,隨著溫度漸變也會上下波動,什么現(xiàn)成的濾波算法來消除波動呢?ADC采集溫度用什么
    發(fā)表于 07-27 10:23

    ADC數(shù)據(jù)進(jìn)行濾波可以用中值濾波算法嗎?

    ADC數(shù)據(jù)進(jìn)行濾波可以用中值濾波算法
    發(fā)表于 10-09 06:29

    卡爾曼濾波算法對比其他的濾波算法什么優(yōu)點(diǎn)?

    卡爾曼濾波算法對比其他的濾波算法什么優(yōu)點(diǎn)
    發(fā)表于 10-11 06:42

    常用的Σ-Δ ADC數(shù)字濾波器類型

    您有沒有想過Σ-Δ模數(shù)轉(zhuǎn)換器(ADC)如何才能在不同帶寬下獲得如此高的分辨率?秘訣就在于數(shù)字濾波器。Σ-Δ ADC之所以與其他類型的數(shù)據(jù)轉(zhuǎn)換器不同,是因?yàn)樗鼈兺ǔ<捎袛?shù)字濾波器。本系
    發(fā)表于 06-09 03:37 ?9651次閱讀
    <b class='flag-5'>常用</b>的Σ-Δ <b class='flag-5'>ADC</b>數(shù)字<b class='flag-5'>濾波</b>器類型

    常用的Σ-Δ_ADC數(shù)字濾波器類型

    常用的Σ-Δ_ADC數(shù)字濾波器類型,學(xué)習(xí)資料,感興趣的可以瞧一瞧。
    發(fā)表于 10-26 17:00 ?0次下載

    單片機(jī)常用PID濾波算法資料匯總

    單片機(jī)常用PID濾波算法資料匯總
    發(fā)表于 05-21 11:45 ?26次下載

    單片機(jī)哪些常用濾波算法詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)哪些常用濾波算法詳細(xì)資料說明包括了:1、限幅濾波法,2、中位值濾波
    發(fā)表于 07-29 17:36 ?4次下載
    單片機(jī)<b class='flag-5'>有</b>哪些<b class='flag-5'>常用</b><b class='flag-5'>濾波</b><b class='flag-5'>算法</b>詳細(xì)資料說明

    單片機(jī)ADC,十大C語言濾波算法

    單片機(jī)ADC,十大C語言濾波算法
    的頭像 發(fā)表于 10-24 15:53 ?1155次閱讀

    STM32的ADC采樣及各式濾波算法實(shí)現(xiàn)

    本文為手把手教學(xué)ADC采樣及各式濾波算法的教程,本教程的MCU采用STM32F103ZET6。以HAL庫的ADC采樣函數(shù)為基礎(chǔ)進(jìn)行教學(xué),通過各式常見
    的頭像 發(fā)表于 10-28 10:51 ?735次閱讀
    STM32的<b class='flag-5'>ADC</b>采樣及各式<b class='flag-5'>濾波</b><b class='flag-5'>算法</b>實(shí)現(xiàn)