工頻干擾是由電力系統(tǒng)引起的一種干擾,中國大陸地區(qū)由50hz及其諧波構(gòu)成的一種干擾,幅值約為ECG(心電信號(hào)的50%)。
工頻干擾可以用陷波器進(jìn)行處理,過濾50hz信號(hào)。常用的工頻陷波器主要有IIR和FIR兩種,其中FIR具有良好的線性相位,但是在同等濾波效果的情況下,IIR的階數(shù)要比FIR少很多,一個(gè)兩階的IIR濾波器的效果FIR要付出100多階的代價(jià),階數(shù)大意味著運(yùn)算量大,對(duì)于一個(gè)MCU單片機(jī)來說這是得不償失的,所以采用IIR濾波器來實(shí)現(xiàn)工頻濾波。
IIR濾波器的設(shè)計(jì)方法有脈沖響應(yīng)不變法和雙線性變換法,如果你已經(jīng)熟悉IIR濾波器的設(shè)計(jì)原理可以直接借用Matlab的Fdatool濾波器設(shè)計(jì)工具直接生成相關(guān)系數(shù),這樣省去了中間設(shè)計(jì)環(huán)節(jié),再通過IIR濾波器的直接II型實(shí)現(xiàn)方式翻譯成C語言格式并應(yīng)用于STM32平臺(tái)(重要:fs為采樣頻率,F(xiàn)notch為陷波頻率)

按Designer鍵即可生成IIR濾波系數(shù)

導(dǎo)出濾波系數(shù)得到轉(zhuǎn)移函數(shù)

這樣再通過直接II型實(shí)現(xiàn)框圖,翻譯成C語言代碼并燒錄到主控MCU中運(yùn)行

x0=ADC_ConvertedValueLocal; //輸入ADC采集到的信號(hào)
w0[0]=IIR_50Notch_A[0]*x0-IIR_50Notch_A[1]*w0[1]-IIR_50Notch_A[2]*w0[2];
y0=IIR_50Notch_B[0]*w0[0]+IIR_50Notch_B[1]*w0[1]+IIR_50Notch_B[2]*w0[2];
w0[2]=w0[1];
w0[1]=w0[0];
前提是你的輸入信號(hào)的時(shí)域采樣率要和濾波器的頻域采樣率要保持一致,這樣就涉及定時(shí)器觸發(fā)ADC采樣,用STM32的定時(shí)器來配置采樣率,
附帶Matlab平臺(tái)仿真實(shí)現(xiàn):
clear all
fs=250; %數(shù)字濾波器的采樣頻率fs=1000hz
f=50; Phz的正弦信號(hào)
t=0:1/fs:4; %時(shí)間間隔,ADC采樣頻率250hz
s=sin(2*pi*f*t);
IIR_B=[0.90239774423695518,-0.55771247730967288,0.90239774423695518];
IIR_A= [1,-0.55771247730967288,0.80479548847391036];
w01=0;
w02=0;
w03=0;
for i=1:1000
w01=s(i)-IIR_A(2)*w02-IIR_A(3)*w03;
y0(i)=IIR_B(1)*w01+IIR_B(2)*w02+IIR_B(3)*w03;
w03=w02;
w02=w01;
end
figure
subplot(211)
axis([1,1000,-1,1]);
hold on
plot(s);
title('直接II型實(shí)現(xiàn)—原始信號(hào)時(shí)域');
subplot(212)
plot(y0,'r');
title('直接II型實(shí)現(xiàn)—信號(hào)濾波之后');

附帶一STM32實(shí)現(xiàn)IIR濾波器的源代碼
http://www.zg4o1577.cn/f/IIR濾波器單片機(jī)實(shí)現(xiàn)藍(lán)牙通訊.zip
*興趣所致與各位分享,本人能力有限若有不足指出還望各位指正(●'??'●)
最后一句:懂者不傲,不懂者勤學(xué)