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

按Designer鍵即可生成IIR濾波系數

導出濾波系數得到轉移函數

這樣再通過直接II型實現框圖,翻譯成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];
前提是你的輸入信號的時域采樣率要和濾波器的頻域采樣率要保持一致,這樣就涉及定時器觸發ADC采樣,用STM32的定時器來配置采樣率,
附帶Matlab平臺仿真實現:
clear all
fs=250; %數字濾波器的采樣頻率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型實現—原始信號時域');
subplot(212)
plot(y0,'r');
title('直接II型實現—信號濾波之后');

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