低通滤波器的c++实现

在电脑上翻到一段代码,实现二阶巴特沃斯低通滤波器。出处不详了。

#pragma once
 
 namespace math
 {
 class __EXPORT LowPassFilter2p
 {
 public:
     // constructor
     LowPassFilter2p(float sample_freq, float cutoff_freq) {
         // set initial parameters
         set_cutoff_frequency(sample_freq, cutoff_freq);
         _delay_element_1 = _delay_element_2 = 0;
     }
 
     // change parameters
     void set_cutoff_frequency(float sample_freq, float cutoff_freq);
 
     // apply - Add a new raw value to the filter 
     // and retrieve the filtered result
     float apply(float sample);
 
     // return the cutoff frequency
     float get_cutoff_freq(void) const {
         return _cutoff_freq;
     }
 
 private:
     float           _cutoff_freq; 
     float           _a1;
     float           _a2;
     float           _b0;
     float           _b1;
     float           _b2;
     float           _delay_element_1;        // buffered sample -1
     float           _delay_element_2;        // buffered sample -2
 };
 
 } // namespace math


#include "LowPassFilter2p.hpp"
 #include "math.h"
 
 namespace math
 {
 
 void LowPassFilter2p::set_cutoff_frequency(float sample_freq, float cutoff_freq)
 {
     _cutoff_freq = cutoff_freq;
     if (_cutoff_freq <= 0.0f) {
         // no filtering
         return;
     }
     float fr = sample_freq/_cutoff_freq;
     float ohm = tanf(M_PI_F/fr);
     float c = 1.0f+2.0f*cosf(M_PI_F/4.0f)*ohm + ohm*ohm;
     _b0 = ohm*ohm/c;
     _b1 = 2.0f*_b0;
     _b2 = _b0;
     _a1 = 2.0f*(ohm*ohm-1.0f)/c;
     _a2 = (1.0f-2.0f*cosf(M_PI_F/4.0f)*ohm+ohm*ohm)/c;
 }
 
 float LowPassFilter2p::apply(float sample)
 {
     if (_cutoff_freq <= 0.0f) {
         // no filtering
         return sample;
     }
     // do the filtering
     float delay_element_0 = sample - _delay_element_1 * _a1 - _delay_element_2 * _a2;
     if (isnan(delay_element_0) || isinf(delay_element_0)) {
         // don't allow bad values to propogate via the filter
         delay_element_0 = sample;
     }
     float output = delay_element_0 * _b0 + _delay_element_1 * _b1 + _delay_element_2 * _b2;
     
     _delay_element_2 = _delay_element_1;
     _delay_element_1 = delay_element_0;
 
     // return the value.  Should be no need to check limits
     return output;
 }
 
 } // namespace math


有几个疑问:

1 截至频率是如何确定的?跟采样频率值之间是什么关系?

2 为什么要计算delay_element_0?

 

阅读材料:

1 http://wenku.baidu.com/link?url=d7uOlbpR_mOvJiwdYpAa5axFmQXk3KDso6cnyPY4MDZ-MLDwS1GuDM_2nuXaED7sgDDzx1DdfDeAgeQj7Jv01QMA5BnvE2iwZzGOj54OZWK

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值