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

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

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

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

x0=ADC_ConvertedValueLocal; //輸入ADC采集到的信號
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];
前提是你的輸入信號的時域采樣率要和濾波器的頻域采樣率要保持一致,這樣就涉及定時器觸發(fā)ADC采樣,用STM32的定時器來配置采樣率,
附帶Matlab平臺仿真實現(xiàn):
clear all
fs=250; %數(shù)字濾波器的采樣頻率fs=1000hz
f=50; Phz的正弦信號
t=0:1/fs:4; %時間間隔,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型實現(xiàn)—原始信號時域');
subplot(212)
plot(y0,'r');
title('直接II型實現(xiàn)—信號濾波之后');

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