這就夠了?一階高通數(shù)字濾波器
預(yù)備知識(shí)
關(guān)于電容
HPF的推導(dǎo)
simulink 仿真
simulink 運(yùn)行結(jié)果
matlab 實(shí)現(xiàn)
matlab 運(yùn)行結(jié)果
C語(yǔ)言實(shí)現(xiàn)
預(yù)備知識(shí)
高通濾波器(HPF-high pass filter
)可以濾除頻率低于截止頻率的信號(hào),類似的還有低通濾波器,帶通濾波器,帶阻濾波器。一階RC高通濾波器的電路如下圖所示;
關(guān)于電容
首先對(duì)電容的幾個(gè)公式做一下補(bǔ)充;電容大小 滿足;
其中 是電容所帶的電荷量, 是電容兩端的電勢(shì)差;另外,電流相當(dāng)于單位時(shí)間流過(guò)導(dǎo)體的電荷量;因此電流 滿足;
根據(jù)①,②可以得到電容大小 和電容的電流 以及兩端電壓 的關(guān)系;
HPF的推導(dǎo)
由以上電路可知,假設(shè)電流為 ,則可知
電容兩端的電壓為 根據(jù)基爾霍夫定律,滿足;
所以結(jié)合①,③,④可以得到;
根據(jù) ③,④,⑤ 可以得到以下關(guān)系;
將方程進(jìn)行離散化,如果輸入 和輸出輸入 按照 的時(shí)間采樣,那么可以將輸入和輸出序列化,則 序列化為:
序列化為:
根據(jù)⑥式可以進(jìn)行離散化,因此最終濾波輸出的序列 如下所示;
將⑦再進(jìn)一步簡(jiǎn)化得到;
其中
所以換成得到;
另外截止頻率和低通濾波器的相同;
將⑧式代入可以得到截止頻率和 的關(guān)系;
這個(gè)公式便于簡(jiǎn)化后面程序以及截止頻率的計(jì)算。
simulink 仿真
這里根據(jù)公式⑥構(gòu)建simulink
的子模塊subsystem
;
具體如下所示;整體的仿真如下圖所示;其中Sine Wave
頻率設(shè)置為2*pi*40
,頻率為40
赫茲;
其中Sine Wave1
頻率設(shè)置為2*pi*4
,頻率為4
赫茲;
所以這里需要使得2*pi*4
的信號(hào)衰減,所以根據(jù),截止頻率
的計(jì)算公式,可以改變?cè)鲆娴闹?,具體如下所示;
這里RC
增益為0.005
,因此
simulink 運(yùn)行結(jié)果
matlab 實(shí)現(xiàn)
matlab
根據(jù)以下這個(gè)公式進(jìn)行數(shù)字濾波器的設(shè)計(jì);
另外 的值如何確定需要參考⑧式;
Serial = 0:0.1:100;
Fs = 1;
Phase = 0;
Amp = 1;
N0 = 2*pi*Fs*Serial - Phase;
X0 = Amp*sin(N0);
subplot(4,1,1);
plot(X0);
Fs = 0.02;
N1 = 2*pi*Fs*Serial - Phase;
X1 = Amp*sin(N1);
subplot(4,1,2);
plot(X1);
X2=X0+X1;
subplot(4,1,3);
plot(X2);
len = length(X2);
X3=X2;
p=0.75;
for i=2:len
X3(i) = p*X3(i-1)+p*(X2(i)- X2(i-1))
end
subplot(4,1,4);
plot(X3);
簡(jiǎn)單地分析一下,代碼中的X1
,X2
,X3
;
-
X1頻率為 1
-
X2頻率為 0.02
因此可以得到截止頻率如下;
matlab 運(yùn)行結(jié)果
C語(yǔ)言實(shí)現(xiàn)
typedef struct
{
int16_t Input[2];
int16_t Output[2];
int32_t FilterTf;
int32_t FilterTs;
int32_t Ky;
} high_filter;
void high_filter_init(high_filter *v);
int16_t high_filter_calc(high_filter *v);
其中;
-
FilterTs
為采樣時(shí)間 ; -
FilterTf
為RC
時(shí)間常數(shù); -
Input[0]
表示 ; -
Input[1]
表示 ; -
Output[0]
表示 ; -
Output[1]
表示 ; -
Ky
表示 ;
參考公式如下所示;
void high_filter_init(high_filter *v){
v->Ky = v->FilterTf*1024/(v->FilterTs + v->FilterTf);
}
int16_t high_filter_calc(high_filter *v){
int32_t tmp = 0;
tmp = ((int32_t)v->Ky*v->Output[1] + v->Ky*(v->Input[0] - v->Input[1]))/1024;
if(tmp>32767){
tmp = 32767;
}
if( tmp < -32768){
tmp = -32768;
}
v->Output[0] = (int16_t)tmp;
v->Output[1] = v->Output[0];
v->Input[1] = v->Input[0];
return v->Output[0];
}
長(zhǎng)按下圖二維碼關(guān)注,獨(dú)自前進(jìn),走得快;結(jié)伴而行,走得遠(yuǎn);在這里除了肝出來(lái)的文章,還有一步一個(gè)腳印學(xué)習(xí)的點(diǎn)點(diǎn)滴滴;
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!