如果本文幫到了你,幫忙點個贊;
如果本文幫到了你,幫忙點個贊;
如果本文幫到了你,幫忙點個贊;
HPF 一階RC高通濾波器詳解(仿真+matlab+C語言實現)
LPF 一階RC低通濾波器詳解(仿真+matlab+C語言實現)
預備知識
高通濾波器(HPF-high pass filter
)可以濾除頻率低於截止頻率的信號,類似的還有低通濾波器,帶通濾波器,帶阻濾波器。一階RC高通濾波器的電路如下圖所示;
關於電容
首先對電容的幾個公式做一下補充;
電容大小
滿足;
其中
是電容所帶的電荷量,
是電容兩端的電勢差;
另外,電流相當於單位時間流過導體的電荷量;因此電流
滿足;
根據①,②可以得到電容大小
和電容的電流
以及兩端電壓
的關系;
HPF的推導
由以上電路可知,假設電流為
,則可知
電容兩端的電壓為
根據基爾霍夫定律,滿足;
所以結合①,③,④可以得到;
根據 ③,④,⑤ 可以得到以下關系;
將方程進行離散化,如果輸入
和輸出輸入
按照
的時間采樣,那么可以將輸入和輸出序列化,則
序列化為:
序列化為:
根據⑥式可以進行離散化,因此最終濾波輸出的序列
如下所示;
將⑦再進一步簡化得到;
其中
所以換成得到;
另外截止頻率和低通濾波器的相同;
將⑧式代入可以得到截止頻率和
的關系;
這個公式便於簡化后面程序以及截止頻率的計算。
simulink 仿真
這里根據公式⑥構建simulink
的子模塊subsystem
;
具體如下所示;
整體的仿真如下圖所示;
其中Sine Wave
頻率設置為2*pi*40
,頻率為40
赫茲;
其中Sine Wave1
頻率設置為2*pi*4
,頻率為4
赫茲;
所以這里需要使得2*pi*4
的信號衰減,所以根據,截止頻率
的計算公式,可以改變增益的值,具體如下所示;
這里RC
增益為0.005
,因此
simulink 運行結果
matlab 實現
matlab
根據以下這個公式進行數字濾波器的設計;
另外
的值如何確定需要參考⑧式;
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 運行結果
C語言實現
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
時間常數;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];
}