色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

常見的濾波算法及其在單片機中的應用介紹(三)

冬至子 ? 來源:HITwh汽院智能車團隊 ? 作者:汽小智 ? 2023-11-21 14:52 ? 次閱讀

01

低通濾波

原理

低通濾波(Low Pass Filter)用于從一個信號中去除高于某個頻率的成分。它的基本原理是,信號中高于某個頻率的成分在信號傳輸或接收過程中會發生衰減,而低于該頻率的成分則不受影響。因此,通過將信號通過一個低通濾波器,可以去除高頻噪聲,保留信號中的低頻成分。

低通濾波器可以采用不同的設計方法,包括基于時域、頻域、以及模擬電路等不同的技術。其中,最常見的是基于時域的差分方程實現的數字濾波器,通??梢苑譃镕IR濾波器和IIR濾波器兩種。

FIR濾波器(Finite Impulse Response Filter)是一種基于差分方程的數字濾波器,其特點是在時域上具有有限沖激響應。FIR濾波器的實現較為簡單,可以通過離散時間的加法和乘法運算實現,具有線性相位和穩定的特點。由于FIR濾波器的階數與其響應的精度有直接關系,因此,設計高階FIR濾波器會面臨計算量和存儲空間的限制。

IIR濾波器(Infinite Impulse Response Filter)是另一種基于差分方程的數字濾波器,其特點是在時域上具有無限沖激響應。IIR濾波器相較于FIR濾波器具有更高的階數和更好的頻率選擇性能,但其存在非線性相位和穩定性的問題。由于IIR濾波器的差分方程中包含反饋回路,因此對于不當的參數設置或實現,可能會導致濾波器不穩定或發生振蕩。

低通濾波器在信號處理領域中應用廣泛,例如音頻處理、圖像處理、通信系統中的調制解調和解擾等等。它可以通過選擇不同的濾波器類型、濾波器參數和濾波器級數等方式來達到不同的濾波效果和性能。

智能車競賽中的低通濾波常指加權遞推平均濾波。

代碼

C++
#define ALPHA 0.2

double lowPassFilter(double currentVal, double prevFilteredVal)
{
double filteredVal;
filteredVal = ALPHA * currentVal + (1 - ALPHA) * prevFilteredVal;
return filteredVal;
}

其中,ALPHA表示濾波器的參數,需要根據具體應用進行調整。該函數的返回值為當前經過低通濾波后的數值。

使用示例

C++
#include
#include
#include

#define ALPHA 0.2

double lowPassFilter(double currentVal, double prevFilteredVal);

int main()
{
double data[10];
double filteredData[10];
double prevFilteredVal = 0;
int i;

srand(time(NULL));

for (i = 0; i < 10; i++) {
    data[i] = rand() % 100;
    filteredData[i] = lowPassFilter(data[i], prevFilteredVal);
    prevFilteredVal = filteredData[i];
    printf("Original data: %.2f, Filtered data: %.2fn", data[i], filteredData[i]);
}

return 0;

}

輸出結果如下所示:

Plain Text
Original data: 67.00, Filtered data: 13.40
Original data: 23.00, Filtered data: 16.72
Original data: 68.00, Filtered data: 24.18
Original data: 98.00, Filtered data: 38.54
Original data: 36.00, Filtered data: 41.03
Original data: 48.00, Filtered data: 45.43
Original data: 41.00, Filtered data: 43.34
Original data: 89.00, Filtered data: 53.67
Original data: 26.00, Filtered data: 47.94
Original data: 77.00, Filtered data: 55.55

可以看出,經過低通濾波后,數據的波動幅度有所減小。

02

高通濾波

原理

高通濾波(High Pass Filter)可以濾除信號中的低頻部分,保留高頻部分。高通濾波器的應用非常廣泛,例如在音頻處理中可以用來去除低頻噪聲、在圖像處理中可以用來增強圖像的邊緣等。

高通濾波算法的基本思想是:將信號分解成高頻和低頻兩部分,去掉低頻部分,只保留高頻部分。高通濾波的實現可以通過頻域方法和時域方法兩種方式實現。

頻域方法是將信號轉換到頻域進行處理,常用的有傅里葉變換和小波變換等。通過濾波器在頻域中濾除低頻成分,然后再將信號轉換回時域。

時域方法則是通過差分等方式,直接在時域中濾除低頻部分。其中最簡單的高通濾波器是一階高通濾波器,可以使用下面的公式表示:

Plaintext
y[n] = a * y[n-1] + a * (x[n] - x[n-1])

其中x[n]是輸入信號,y[n]是輸出信號,a是濾波器的系數。該濾波器的作用是去除輸入信號中的低頻分量,只保留高頻部分。

高通濾波器也可以使用其他階數的濾波器進行實現,如二階高通濾波器、Butterworth高通濾波器等。不同階數的濾波器可以達到不同的濾波效果。

需要注意的是,高通濾波器會使得信號的振幅發生變化,因此在應用高通濾波器時需要謹慎選擇濾波器的參數和階數,以免對信號造成不必要的影響。

代碼

C++
#define FILTER_ALPHA 0.5 // 濾波系數

float highpass_filter(float input, float prev_output)
{
float output = FILTER_ALPHA * (prev_output + input - prev_input);
prev_input = input;
return output;
}

在這個函數中,prev_input 和 prev_output 是上一次輸入和輸出的值,FILTER_ALPHA 是濾波系數,控制著濾波器對當前值和先前值的權重。

使用示例

C++

#include

int main()

{

float input[] = {2.0, 3.0, 4.0, 5.0, 4.0, 3.0, 2.0, 1.0}; // 輸入信號

float prev_output = 0.0; // 上一個輸出值

int len = sizeof(input) / sizeof(float); // 輸入信號長度



printf("原始信號:");

for (int i = 0; i

C++
#include

int main()
{
float input[] = {2.0, 3.0, 4.0, 5.0, 4.0, 3.0, 2.0, 1.0}; // 輸入信號
float prev_output = 0.0; // 上一個輸出值
int len = sizeof(input) / sizeof(float); // 輸入信號長度

printf("原始信號:");
for (int i = 0; i < len; i++) {
    printf("%.2f ", input[i]);
}

printf("n高通濾波后:");
for (int i = 0; i < len; i++) {
    prev_output = highpass_filter(input[i], prev_output);
    printf("%.2f ", prev_output);
}

return 0;

}

在這個示例中,我們定義了一個包含 8 個值的輸入信號,然后通過高通濾波函數 highpass_filter 處理這個信號,最終輸出濾波后的結果。在濾波的過程中,我們保存了上一次的輸出值,將其作為本次輸入的“前一個值”傳遞給濾波函數。

03

帶通濾波

原理

帶通濾波是一種可以濾除某一頻率范圍內信號的濾波器。它可以保留一定頻率范圍內的信號,而抑制其他頻率范圍內的信號。一般來說,帶通濾波可以通過將高通濾波器和低通濾波器串聯而實現。

具體來說,帶通濾波器可以使用以下的傳遞函數來表示:

Plaintext
H(s) = (s/w_0) / ((s/w_0)^2 + (s/Q*w_0) + 1)

其中,s 是頻率域中的復變量,w_0 是中心頻率,Q 是質量因子,用來描述帶通濾波器的帶寬。質量因子越大,帶寬越窄,信號在帶內的幅值越大。

在時域中,帶通濾波器可以通過以下的差分方程來實現:

Plaintext
y[n] = 2*cos(w_0)y[n-1] - y[n-2] + x[n] - 2cos(w_0)*cos(w_c)*x[n-1] + cos(w_c)*cos(w_c)*y[n-1]

其中,x[n] 和 y[n] 分別表示輸入和輸出信號,w_c 是帶通濾波器的截止頻率,通過 w_c 和 w_0 可以計算出帶通濾波器的上下截止頻率。

使用帶通濾波器可以在信號處理中削弱或抑制不需要的頻率,從而濾除干擾信號或濾除噪聲信號,保留需要的信號。

代碼

C++
#include
#include
#include

#define PI 3.1415926

/* 生成帶通濾波器 */
void bandPassFilter(double f1, double f2, double fs, int N, double *b, double *a) {
int i, j;
double w1 = 2 * PI * f1 / fs;
double w2 = 2 * PI * f2 / fs;
double bw = w2 - w1;
double M = N / 2.0;
double H[M];
double w[M];

/* 計算帶通濾波器的理想幅頻特性 */
for (i = 0; i < M; i++) {
    if (i == M / 2) {
        H[i] = bw / PI;
    } else {
        H[i] = sin(bw * (i - M / 2.0)) / (PI * (i - M / 2.0));
    }
    w[i] = 0.54 - 0.46 * cos(2 * PI * i / N);  /* 漢寧窗函數 */
    H[i] *= w[i];
}

/* 求出帶通濾波器的差分方程系數 */
for (i = 0; i < N; i++) {
    b[i] = 0;
    a[i] = 0;
}
b[0] = H[0];
a[0] = 1;
for (i = 1; i < M; i++) {
    b[i] = H[i];
    a[i] = 2 * cos(w1 * i);
}
for (i = N - 1, j = 1; i >= M; i--, j++) {
    b[i] = H[j];
    a[i] = 2 * cos(w2 * j);
}

}

/* 帶通濾波函數 */
void filter(double *x, double *y, int N, double *b, double *a) {
int i, j;
double sum1, sum2;

for (i = 0; i < N; i++) {
    sum1 = sum2 = 0;
    for (j = 0; j <= i; j++) {
        sum1 += b[j] * x[i - j];
    }
    for (j = 1; j <= i; j++) {
        sum2 += a[j] * y[i - j];
    }
    y[i] = sum1 - sum2;
}

}

使用示例

C++
#include
#include
#include "bandPassFilter.h"

#define N 100 /* 采樣點數 /
#define Fs 1000 /
采樣頻率 */

int main() {
double x[N], y[N];
double b[101], a[101]; /* b和a數組長度為N+1 */

/* 生成測試信號,包含10Hz和100Hz的正弦波 */
for (int i = 0; i < N; i++) {
    x[i] = sin(2 * PI * 10 * i / Fs) + sin(2 * PI * 100 * i / Fs);
}

/* 生成帶通濾波器 */
double f1 = 20;  /* 通帶下界頻率 */
double f2 = 80;  /* 通帶上界頻率 */
bandPassFilter(f1, f2, Fs, N+1, b, a);

/* 對測試信號進行帶通濾波 */
filter(x, y, N, b, a);

/* 輸出濾波后的信號 */
for (int i = 0; i < N; i++) {
    printf("%f ", y[i]);
}

return 0;

}

在這個示例中,首先生成一個包含10Hz和100Hz正弦波的測試信號。然后,使用bandPassFilter函數生成一個通帶在20Hz到80Hz之間的帶通濾波器。最后,使用filter函數對測試信號進行帶通濾波,輸出濾波后的信號。

04

自適應濾波

原理

自適應濾波是一種根據輸入信號自動調整濾波器參數的濾波方法。該方法通過分析信號的特性,自動調整濾波器參數以達到最優的濾波效果。

常見的自適應濾波方法包括基于卡爾曼濾波、基于最小均方差(LMS)算法、基于最小二乘(RLS)算法等。

其中,LMS算法是一種簡單而有效的自適應濾波算法,它根據當前誤差的大小自適應地更新濾波器的系數,從而達到最小化誤差的目的。LMS算法的實現過程如下:

a. 初始化濾波器的系數,通常為0。

b. 將輸入信號x[n]送入濾波器,并得到輸出信號y[n]。

c. 計算當前的誤差e[n] = d[n] - y[n],其中d[n]為期望輸出。

d. 根據LMS算法的公式更新濾波器系數,即:w[i] = w[i] + mu * e[n] * x[n-i],其中mu為步長因子。

e. 重復2~4步直到收斂。

自適應濾波適用于信號在時間和頻率上都隨時間變化的情況,例如音頻信號中的噪聲、抖動等干擾。它能夠自動地調整濾波器的參數以適應輸入信號的變化,從而獲得更好的濾波效果。

代碼

下面是一個基于LMS算法的自適應濾波器的C語言實現示例,包括濾波器初始化、濾波器更新、濾波器輸出三個部分。

C++
#include
#include

#define N 10 /* 濾波器長度 /
#define LAMBDA 0.1 /
步長 /
#define DELTA 0.001 /
初始誤差 /
#define M 10 /
信號長度 */

/* 自適應濾波器初始化 */
void initFilter(double *w) {
int i;
for (i = 0; i < N; i++) {
w[i] = 0;
}
}

/* 自適應濾波器更新 */
void updateFilter(double *w, double *x, double d) {
int i, j;
double y, e;
double u[N]; /
輸入向量 */

/* 初始化輸入向量 */
for (i = 0; i   N; i++) {
    u[i] = 0;
    for (j = 0; j   N; j++) {
        if (i  >= j) {
            u[i] += x[i - j] * w[j];
        }
    }
}

/* 計算輸出、誤差和權值更新 */
for (i = 0; i   M; i++) {
    y = 0;
    for (j = 0; j   N; j++) {
        y += x[i - j] * w[j];
    }
    e = d[i] - y;
    for (j = 0; j   N; j++) {
        w[j] += LAMBDA * e * u[j];
    }
}

}

/* 自適應濾波器輸出 */
void filter(double *w, double *x, double *y) {
int i, j;
for (i = 0; i < M; i++) {
y[i] = 0;
for (j = 0; j < N; j++) {
y[i] += x[i - j] * w[j];
}
}
}

int main() {
int i;
double w[N]; /* 濾波器權值 /
double x[M]; /
輸入信號 /
double d[M]; /
期望信號 /
double y[M]; /
輸出信號 */

/* 初始化輸入信號和期望信號 */
for (i = 0; i < M; i++) {
    x[i] = sin(i);
    d[i] = sin(i + 1);
}

/* 自適應濾波器初始化 */
initFilter(w);

/* 自適應濾波器更新 */
updateFilter(w, x, d);

/* 自適應濾波器輸出 */
filter(w, x, y);
/* 輸出結果 */
for (i = 0; i < M; i++) {
    printf("x[%d] = %f, d[%d] = %f, y[%d] = %fn", i, x[i], i, d[i], i, y[i]);
}

return 0;

}

以上代碼實現了基于LMS算法的自適應濾波器,并進行了一個簡單的測試。代碼中首先定義了濾波器的長度N、步長LAMBDA、初始誤差DELTA和信號長度M等參數。然后定義了三個主要的函數:初始化濾波器權值的函數initFilter、更新濾波器權值的函數updateFilter和計算濾波器輸出的函數filter。

在main函數中,先初始化輸入信號x和期望信號d,然后調用initFilter函數初始化濾波器權值。接著,調用updateFilter函數更新濾波器權值。最后,調用filter函數計算濾波器的輸出y。程序預測輸出結果為一個長度為M的數組y,表示濾波器對輸入信號x的濾波結果。

由于輸入信號x和期望信號d是根據sin函數生成的,因此預測輸出結果也將是一個sin函數的變化曲線。具體的輸出結果將受到LAMBDA、DELTA、N和M等參數的影響。如果LAMBDA較小,則濾波器收斂速度較慢,但精度較高;如果LAMBDA較大,則濾波器收斂速度較快,但精度較低。DELTA越小,濾波器收斂速度越快。N越大,濾波器的濾波效果越好,但計算量也會增加。M越大,濾波器的濾波效果也會越好,但計算量同樣也會增加。

總的來說,濾波算法有很多種,每種算法都有自己的特點和適用范圍。選擇合適的濾波算法需要根據具體應用場景和數據特征進行綜合考慮。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 調制解調
    +關注

    關注

    0

    文章

    75

    瀏覽量

    21658
  • 濾波器
    +關注

    關注

    161

    文章

    7859

    瀏覽量

    178705
  • 信號處理
    +關注

    關注

    48

    文章

    1041

    瀏覽量

    103370
  • fir濾波器
    +關注

    關注

    1

    文章

    95

    瀏覽量

    19073
  • 低通濾波
    +關注

    關注

    0

    文章

    18

    瀏覽量

    16060
收藏 人收藏

    評論

    相關推薦

    如何用單片機實現數字濾波?6種數字濾波算法解析

    單片機主要作用是控制外圍的器件,并實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,盡管單片機并不擅長實現算法和進行復雜的運算。下面主要是介紹如何用
    的頭像 發表于 02-28 09:41 ?8935次閱讀
    如何用<b class='flag-5'>單片機</b>實現數字<b class='flag-5'>濾波</b>?6種數字<b class='flag-5'>濾波</b><b class='flag-5'>算法</b>解析

    常見濾波算法及其單片機的應用介紹(一)

    限幅消抖濾波法是一種簡單有效的數字濾波算法,常用于對采集到的離散信號進行去抖動處理。它可以去除信號的瞬時噪聲和突發干擾,同時保留信號的主要特征。
    的頭像 發表于 11-21 14:47 ?2009次閱讀

    常見濾波算法及其單片機的應用介紹(二)

    中值濾波是一種非線性濾波算法,它將信號的每個采樣點替換成該采樣點鄰域內的中值。它的主要思想是通過找到鄰域內的中值來消除信號的噪聲,同時盡
    的頭像 發表于 11-21 14:50 ?1619次閱讀

    單片機數據采集——數字濾波算法

    單片機主要作用是控制外圍的器件,并實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,盡管單片機并不擅長實現算法和進行復雜的運算。下面主要是介紹如何用
    發表于 02-20 15:14

    單片機數字濾波算法

    運算,盡管單片機并不擅長實現算法和進行復雜的運算。下面主要是介紹如何用單片機實現數字濾波。
    發表于 10-30 17:44

    算法移植到STM32單片機常見的問題有哪些?

    算法移植到STM32單片機常見的問題有哪些?
    發表于 11-22 07:10

    如何用單片機實現數字濾波算法

    單片機主要作用是控制外圍的器件,并實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,盡管單片機并不擅長實現算法和進行復雜的運算。下面主要是介紹如何用
    發表于 01-07 06:30

    單片機常用PID濾波算法資料匯總

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

    使用51單片機實現MPU6050的卡爾曼濾波算法代碼免費下載

    本文檔的主要內容詳細介紹的是使用51單片機實現MPU6050的卡爾曼濾波算法代碼免費下載 。
    發表于 08-20 17:31 ?60次下載
    使用51<b class='flag-5'>單片機</b>實現MPU6050的卡爾曼<b class='flag-5'>濾波</b><b class='flag-5'>算法</b>代碼免費下載

    單片機晶振電路的作用及常見參數的介紹

    每個單片機系統里都有晶振,全程是叫晶體震蕩器,單片機系統里晶振的作用非常大。本文就來給大家簡單的介紹下晶振的工作過程,以及其主要的參數
    的頭像 發表于 12-24 12:35 ?3560次閱讀

    這篇把單片機數字濾波算法講絕了

    單片機主要作用是控制外圍的器件,并實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,盡管單片機并不擅長實現算法和進行復雜的運算。下面主要是介紹如何用
    發表于 02-10 10:22 ?8次下載
    這篇把<b class='flag-5'>單片機</b>數字<b class='flag-5'>濾波</b><b class='flag-5'>算法</b>講絕了

    單片機十種常見的ADC濾波算法

    單片機主要作用是控制外圍的器件,并實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,盡管單片機并不擅長實現算法和進行復雜的運算。下面給大家介紹十種
    發表于 10-02 15:21 ?1553次閱讀

    單片機十種常見濾波算法介紹

    我們都知道,單片機的主要作用是控制外圍的器件,并實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,盡管單片機并不擅長實現算法和進行復雜的運算。
    的頭像 發表于 11-06 21:41 ?6000次閱讀

    單片機引腳的VCC和VDD有什么區別?

    單片機作為一種常見的嵌入式設備,是許多電子設備和系統必不可少的一部分。而在單片機的設計和應用,電源電壓是一個非常重要的參數,而其中VCC
    的頭像 發表于 04-27 17:29 ?8615次閱讀
    <b class='flag-5'>單片機</b>引腳<b class='flag-5'>中</b>的VCC和VDD有什么區別?

    單片機ADC,十大C語言濾波算法

    單片機ADC,十大C語言濾波算法
    的頭像 發表于 10-24 15:53 ?1330次閱讀
    主站蜘蛛池模板: 果冻传媒在线观看完整版免费 | GOGOGO高清在线播放免费 | 蜜臀AV熟女人妻中文字幕 | 国产精品97久久久久久AV色戒 | 国产精品一区二区制服丝袜 | 国产成人在线网站 | 美女胸被男子强捏视频 | 失禁 调教 刺激 哭喊男男 | 天天干夜夜叭 | a视频免费在线观看 | 国产永久免费高清在线观看 | 中文字幕 日韩 无码 在线 | 在线免费观看成年人视频 | 国产精品久久久久精品A片软件 | 暖暖日本 在线 高清 | 扒开她的黑森林让我添动态图 | 国产国产人免费观看在线视频 | 日韩中文字幕亚洲无线码 | 国产九九熟女在线视频 | 久久精品一本到东京热 | 亚洲高清视频免费 | 国产午夜婷婷精品无码A片 国产午夜视频在永久在线观看 | 色中色入口2015 | 最近的2019中文字幕国语HD | 男人桶女人j的视频在线观看 | 苍井空小公主qvod | 成人毛片18岁女人毛片免费看 | bl(高h)文 | 狠狠狠色丁香婷婷综合久久 | 小黄文污到你湿 | 久久免费精品视频 | 自拍视频亚洲综合在线精品 | 亚洲午夜无码久久久久蜜臀av | 日本人的xxxxxxxxx69 | 果冻传媒色AV国产播放 | 欧美一区二区三区久久综 | 国产成人精品自拍 | 日韩中文亚洲欧美视频二 | 免费看大黄高清网站视频在线 | 午夜AV亚洲一码二中文字幕青青 | 麻豆一二三四区乱码 |