- 1 預(yù)備知識(shí)
- 2 simulink 仿真
- 3 simulink 運(yùn)行結(jié)果
- 4 matlab 實(shí)現(xiàn)
- 5 matlab 運(yùn)行結(jié)果
- 6 C 語(yǔ)言實(shí)現(xiàn)
- 7 C 語(yǔ)言運(yùn)行結(jié)果
1 預(yù)備知識(shí)
低通濾波器(LPF
)可以濾除頻率高于截止頻率的信號(hào),類(lèi)似的還有高通濾波器,帶通濾波器,帶阻濾波器。一階 RC 低通濾波器的電路如下圖所示;
2 simulink 仿真
這里直接根據(jù)公式③構(gòu)建一搞Subsystem
;
Subsystem
整體的仿真圖如下:其中Sine Wave
頻率設(shè)置為2*pi*50
其中Sine Wave1
頻率設(shè)置為2*pi
所以這里需要使得2*pi*50
的信號(hào)衰減,所以根據(jù),截止頻率的計(jì)算公式,可以改變?cè)鲆娴闹?,具體如下所示;
3 simulink 運(yùn)行結(jié)果
最終的仿真的運(yùn)行結(jié)果如下圖所示;Gain Value
為0.005
Gain Value
為0.0318
4 matlab 實(shí)現(xiàn)
根據(jù)公式
實(shí)現(xiàn)數(shù)字一階 RC 低通濾波器,具體 matlab 程序如下;
Serial?=?0:0.1:100;
Fs?=?1;
Phase?=?0;
Amp?=?1;
%?高頻信號(hào)
N0?=?2*pi*Fs*Serial?-?Phase;
X0?=?Amp*sin(N);
subplot(4,1,1);
plot(X0);
%?低頻信號(hào)
Fs?=?0.02;
N1?=?2*pi*Fs*Serial?-?Phase;
X1?=?Amp*sin(N1);
subplot(4,1,2);
plot(X1);
%?高頻低頻疊加的信號(hào)
X2=X0+X1;
subplot(4,1,3);
plot(X2);
%Xi-Yi=RC*(Yi?-?Yi-1)/DetalT
len?=?length(X2);
X3=X2;
p=0.05;
%?一階 RC 濾波得到 X3
for?i=2:len
????X3(i)?=?p*X2(i)+(1-p)*X3(i-1);
end
subplot(4,1,4);
plot(X3);
5 matlab 運(yùn)行結(jié)果
運(yùn)行結(jié)果如下所示;
6 C 語(yǔ)言實(shí)現(xiàn)
low_filter.h
typedef?struct
{
?????int16_t??Input;
?????int16_t??Output[2];
?????int32_t??FilterTf;??
?????int32_t??FilterTs;
?????int32_t??Kr;
?????int32_t??Ky;
?
}?low_filter;
void?low_filter_init(low_filter?*v);
int16_t?low_filter_calc(low_filter?*v);
其中;
FilterTs
為采樣時(shí)間;FilterTf
為RC
時(shí)間常數(shù)
具體參考下圖;
low_filter.c
void?low_filter_init(low_filter?*v){
?
?????v->Kr?=?v->FilterTs*1024/(v->FilterTs?+?v->FilterTf);
?????v->Ky?=?v->FilterTf*1024/(v->FilterTs?+?v->FilterTf);
}
int16_t?low_filter_calc(low_filter?*v){
????int32_t?tmp?=?0;
????tmp?=?((int32_t)v->Kr*v->Input?+?v->Ky*v->Output[1])/1024;
?
????if(tmp>32767){
??????tmp?=?32767;
????}
?
???if(?tmp?<?-32768){
????tmp?=?-32768;
???}
?
????v->Output[0]?=?(int16_t)tmp;
????v->Output[1]?=?v->Output[0];
???return?v->Output[0];
}
7 C 語(yǔ)言運(yùn)行結(jié)果
實(shí)際測(cè)試結(jié)果;