加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 预备知识
    • simulink 仿真
    • simulink 运行结果
    • matlab 实现
    • matlab 运行结果
    • C 语言实现
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

这就够了?一阶高通数字滤波器

2020/07/03
418
阅读需 6 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
  • 预备知识
  • simulink 仿真
  • simulink 运行结果
  • matlab 实现
  • matlab 运行结果
  • C 语言实现

预备知识

高通滤波器HPF-high pass filter)可以滤除频率低于截止频率的信号,类似的还有低通滤波器带通滤波器带阻滤波器。一阶 RC 高通滤波器的电路如下图所示;

 

关于电容

首先对电容的几个公式做一下补充;电容大小满足;

其中 是电容所带的电荷量, 是电容两端的电势差;另外,电流相当于单位时间流过导体的电荷量;因此电流 满足;

根据①,②可以得到电容大小 和电容的电流 以及两端电压 的关系;

HPF 的推导

由以上电路可知,假设电流为 i(t) ,则可知

电容两端的电压为 Vc(t) 根据基尔霍夫定律,满足;

所以结合①,③,④可以得到;

根据 ③,④,⑤ 可以得到以下关系;

simulink 仿真

这里根据公式⑥构建simulink的子模块subsystem

具体如下所示;

整体的仿真如下图所示;

其中Sine Wave频率设置为2*pi*40,频率为40赫兹;

 

其中Sine Wave1频率设置为 2*pi*4,频率为4赫兹;

 

所以这里需要使得2*pi*4的信号衰减,所以根据,截止频率 fc的计算公式,可以改变增益的值,具体如下所示;

这里RC增益为0.005,因此

simulink 运行结果

 

matlab 实现

matlab根据以下这个公式进行数字滤波器的设计;

另外 的值如何确定需要参考⑧式;

Serial = 0:0.1:100;
Fs = 1;
Phase = 0;
Amp = 1;

N0 = 2*pi*Fs*Serial - Phase;
X0 = Amp*sin(N0);
subplot(4,1,1);
plot(X0);

Fs = 0.02;
N1 = 2*pi*Fs*Serial - Phase;
X1 = Amp*sin(N1);
subplot(4,1,2);
plot(X1);

X2=X0+X1;
subplot(4,1,3);
plot(X2);

len = length(X2);
X3=X2;
p=0.75;

for i=2:len
    X3(i) = p*X3(i-1)+p*(X2(i)- X2(i-1))
end

subplot(4,1,4);
plot(X3);

简单地分析一下,代码中的X1X2X3

  • X1 频率为1
  • X2 频率为0.02

因此可以得到截止频率如下;

matlab 运行结果

C 语言实现

typedef struct
{
     int16_t  Input[2];
     int16_t  Output[2];
     int32_t  FilterTf;  
     int32_t  FilterTs;
     int32_t  Ky;
} high_filter;

void high_filter_init(high_filter *v);
int16_t high_filter_calc(high_filter *v);

void high_filter_init(high_filter *v){ 
     v->Ky = v->FilterTf*1024/(v->FilterTs + v->FilterTf);
}

int16_t high_filter_calc(high_filter *v){

 int32_t tmp = 0;

 tmp = ((int32_t)v->Ky*v->Output[1] + v->Ky*(v->Input[0] - v->Input[1]))/1024;
 if(tmp>32767){
  tmp = 32767;
 }
 
 if( tmp < -32768){
  tmp = -32768;
 }
 
    v->Output[0] = (int16_t)tmp;
    v->Output[1] = v->Output[0];
    v->Input[1] = v->Input[0];
 return v->Output[0];
}

相关推荐

电子产业图谱

CSDN博客专家,公众号小麦大叔主笔,资深嵌入式系统工程师,曾从事移动终端,智能硬件以及物联网等消费电子产品的软硬件研发,分享,总结,提高,相互交流,共同进步。