![]() |
成熟的单杠 · Unity各种功能实现之一:对话系统 - ...· 2 月前 · |
![]() |
谦和的冰棍 · 温州主城区公交分担率居全省第三 ...· 4 月前 · |
![]() |
会开车的火龙果 · 毒舌大状 太子 - 抖音· 1 年前 · |
![]() |
低调的饭盒 · 世界奇妙物语最恐怖的十大故事 - 抖音· 1 年前 · |
![]() |
坏坏的啤酒 · 第149话 林安安是我的人 - ...· 1 年前 · |
如果本文帮到了你,帮忙点个赞;
如果本文帮到了你,帮忙点个赞;
如果本文帮到了你,帮忙点个赞;
HPF 一阶RC高通滤波器详解(仿真+matlab+C语言实现)
LPF 一阶RC低通滤波器详解(仿真+matlab+C语言实现)
高通滤波器(
HPF-high pass filter
)可以滤除频率低于截止频率的信号,类似的还有低通滤波器,带通滤波器,带阻滤波器。一阶RC高通滤波器的电路如下图所示;
首先对电容的几个公式做一下补充;
电容大小
C
满足;
C
=
V
q
⋯
①
其中
q
是电容所带的电荷量,
V
是电容两端的电势差;
另外,
电流
相当于单位时间流过导体的电荷量;因此电流
i
满足;
i
=
d
t
d
q
⋯
②
根据①,②可以得到电容大小
C
和电容的电流
i
以及两端电压
V
的关系;
i
(
t
)
=
C
d
t
d
v
(
t
)
由以上电路可知,假设电流为
i
(
t
)
,则可知
⎩
⎨
⎧
V
o
u
t
=
R
i
(
t
)
⋯
③
i
(
t
)
=
C
d
t
d
Q
c
(
t
)
⋯
④
电容两端的电压为
V
c
(
t
)
根据基尔霍夫定律,满足;
−
V
i
n
+
V
C
+
V
o
u
t
=
0
所以结合①,③,④可以得到;
Q
c
(
t
)
=
C
(
V
i
n
(
t
)
−
V
o
u
t
(
t
)
)
⋯
⑤
根据 ③,④,⑤ 可以得到以下关系;
V
o
u
t
=
C
(
d
t
d
V
i
n
−
d
t
d
V
o
u
t
)
I
(
t
)
R
=
R
C
(
d
t
d
V
i
n
−
d
t
d
V
o
u
t
)
⋯
⑥
将方程进行离散化,如果输入
V
i
n
和输出输入
V
o
u
t
按照
△
T
的时间采样,那么可以将输入和输出序列化,则
V
i
n
序列化为:
(
x
1
,
x
2
,
x
3
⋯
,
x
n
−
1
,
x
n
)
V
o
u
t
序列化为:
(
y
1
,
y
2
,
y
3
⋯
,
y
n
−
1
,
y
n
)
根据⑥式可以进行离散化,因此最终滤波输出的序列
y
i
如下所示;
y
i
=
R
C
(
△
T
x
i
−
x
i
−
1
−
△
T
y
i
−
y
i
−
1
)
⋯
⑦
将⑦再进一步简化得到;
y i = α y i − 1 + α ( x i − x i − 1 )
其中 α = R C + △ T R C
所以换成得到;
R
C
=
△
T
(
1
−
α
α
)
⋯
⑧
另外截止频率和低通滤波器的相同;
f
c
=
2
π
R
C
1
将⑧式代入可以得到截止频率和
α
的关系;
f
c
=
2
π
α
△
T
1
−
α
这个公式便于简化后面程序以及截止频率的计算。
这里根据公式⑥构建
simulink
的子模块
subsystem
;
V
o
u
t
=
R
C
(
d
t
d
V
i
n
−
d
t
d
V
o
u
t
)
具体如下所示;
整体的仿真如下图所示;
其中
Sine Wave
频率设置为
2*pi*40
,频率为
40
赫兹;
其中
Sine Wave1
频率设置
为2*pi*4
,频率为
4
赫兹;
所以这里需要使得
2*pi*4
的信号衰减,所以根据,截止频率
f
c
的计算公式,可以改变增益的值,具体如下所示;
这里
RC
增益为
0.005
,因此
f
c
=
2
π
R
C
1
=
2
π
∗
0
.
0
0
5
1
≈
3
1
.
8
matlab
根据以下这个公式进行数字滤波器的设计;
y
i
=
α
y
i
−
1
+
α
(
x
i
−
x
i
−
1
)
另外
α
的值如何确定需要参考⑧式;
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)) subplot(4,1,4); plot(X3);
简单地分析一下,代码中的
X1
,X2
,X3
;X1频率为 1
X2频率为 0.02
⎩⎪⎪⎪⎨⎪⎪⎪⎧α=p=0.75△T=0.1fc=2πα△T1−α
因此可以得到截止频率如下;
fc=2π∗0.75∗0.10.25≈0.53
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
为采样时间 △T;FilterTf
为RC
时间常数;Input[0]
表示 xi;Input[1]
表示 xi−1;Output[0]
表示 yi;Output[1]
表示 yi−1;Ky
表示RC+△TRC;参考公式如下所示;
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];