這就夠了?一階高通數(shù)字濾波器
預備知識
關(guān)于電容
HPF的推導
simulink 仿真
simulink 運行結(jié)果
matlab 實現(xiàn)
matlab 運行結(jié)果
C語言實現(xiàn)
預備知識
高通濾波器(HPF-high pass filter
)可以濾除頻率低于截止頻率的信號,類似的還有低通濾波器,帶通濾波器,帶阻濾波器。一階RC高通濾波器的電路如下圖所示;
關(guān)于電容
首先對電容的幾個公式做一下補充;電容大小 滿足;
其中 是電容所帶的電荷量, 是電容兩端的電勢差;另外,電流相當于單位時間流過導體的電荷量;因此電流 滿足;
根據(jù)①,②可以得到電容大小 和電容的電流 以及兩端電壓 的關(guān)系;
HPF的推導
由以上電路可知,假設電流為 ,則可知
電容兩端的電壓為 根據(jù)基爾霍夫定律,滿足;
所以結(jié)合①,③,④可以得到;
根據(jù) ③,④,⑤ 可以得到以下關(guān)系;
將方程進行離散化,如果輸入 和輸出輸入 按照 的時間采樣,那么可以將輸入和輸出序列化,則 序列化為:
序列化為:
根據(jù)⑥式可以進行離散化,因此最終濾波輸出的序列 如下所示;
將⑦再進一步簡化得到;
其中
所以換成得到;
另外截止頻率和低通濾波器的相同;
將⑧式代入可以得到截止頻率和 的關(guān)系;
這個公式便于簡化后面程序以及截止頻率的計算。
simulink 仿真
這里根據(jù)公式⑥構(gòu)建simulink
的子模塊subsystem
;
具體如下所示;整體的仿真如下圖所示;其中Sine Wave
頻率設置為2*pi*40
,頻率為40
赫茲;
其中Sine Wave1
頻率設置為2*pi*4
,頻率為4
赫茲;
所以這里需要使得2*pi*4
的信號衰減,所以根據(jù),截止頻率
的計算公式,可以改變增益的值,具體如下所示;
這里RC
增益為0.005
,因此
simulink 運行結(jié)果
matlab 實現(xiàn)
matlab
根據(jù)以下這個公式進行數(shù)字濾波器的設計;
另外 的值如何確定需要參考⑧式;
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);
簡單地分析一下,代碼中的X1
,X2
,X3
;
-
X1頻率為 1
-
X2頻率為 0.02
因此可以得到截止頻率如下;
matlab 運行結(jié)果
C語言實現(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
為采樣時間 ; -
FilterTf
為RC
時間常數(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];
}
長按下圖二維碼關(guān)注,獨自前進,走得快;結(jié)伴而行,走得遠;在這里除了肝出來的文章,還有一步一個腳印學習的點點滴滴;
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!