算法学习笔记之50HZ陷波滤波器设计

 工频干扰是由电力系统引起的一种干扰,中国大陆地区由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型实现—信号滤波之后');

### 50Hz陷波滤波器的Simulink仿真 #### 创建新的Simulink模型 启动MATLAB并打开一个新的Simulink模型窗口。 #### 添加必要的模块 为了构建一个有效的50Hz陷波滤波器,在Simulink库浏览器中查找并添加以下组件到工作区: - **Sine Wave Generator (正弦波发生器)**:用于生成含有50Hz干扰成分的输入信号[^1]。 - **Notch Filter Block (陷波滤波器模块)** 或者使用 Transfer Fcn 来手动配置传递函数实现自定义的二阶陷波特性。对于后者,可以设置分母多项式的系数以形成中心频率为50Hz的极点对,从而创建所需的陷波特性和品质因数Q值[^2]。 - **Scope (示波器)**:用来观察原始信号和经过处理后的输出信号之间的差异。 #### 配置陷波滤波器参数 当采用Transfer Fcn方法时,可以通过下面的方式设定参数来获得理想的陷波响应: 假设想要抑制电网常见的工频噪声即50 Hz, 可以按照如下方式设置传递函数中的分子与分母系数向量numerator 和 denominator : ```matlab % 定义陷波频率f_notch=50Hz及其对应的角频率w_notch fs = 1e3; % 假设采样率为1kHz f_notch = 50; w_notch = 2*pi*f_notch/fs; % 设置质量因子 Q-factor Q_factor = 30; % 构建二阶IIR陷波滤波器的传递函数表达式 [b,a]=iirnotch(w_notch,Q_factor); ``` 然后将得到的结果`b`, `a`分别作为Transfer Function block里的Numerator coefficients 和 Denominator coefficients 输入项的内容。 #### 进行仿真验证 连接好各个模块之后就可以运行模拟实验了。通过改变源端加入的不同幅度比例的50Hz扰动成分,查看经由所设计好的陷波装置净化过后的波形变化情况,以此评估该方案的有效性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值