iir数字滤波器的原理_iir滤波器和fir滤波器

iir数字滤波器的原理_iir滤波器和fir滤波器基于STM32的二阶直接II型巴特沃斯低通滤波器设计方法及应用_iir滤波器

目录

一、IIR数字滤波器原理

二、MATLAB/simulink设计方法及示例代码

三、基于stm32的嵌入式应用及代码


一、IIR数字滤波器原理

IIR(Infinite-duration Impulse Responses) 即无限长脉冲响应滤波器。

以设计IIR巴特沃斯低通滤波器为例,其离散形式为

iir数字滤波器的原理_iir滤波器和fir滤波器

其直接II型结构为:

iir数字滤波器的原理_iir滤波器和fir滤波器

二、MATLAB/simulink设计方法及示例代码

设计步骤:

Step1:对原时域信号进行傅里叶变换,得到原信号的频谱图;

举例:原信号是基波频率为10Hz、干扰信号为100Hz、300Hz的混合信号

clear all;
close all;
fs = 1000;  %采样频率 1KHz 
T = 1;%时间宽度,可以理解为采样时间长度
ts = 1/fs;%数据之间采样间隔
N = T*fs;%采样点数T/ts
t = (0:N-1)*ts;
%基波:幅值为3的1Hz正弦波
Signal_Original_1 = 3*sin(20*pi*t); 
%噪声函数 赋值为基波的1/3 100hz 300hz 正弦波 
Noise_White_1  = sin(2*pi*100*t)+sin(2*pi*300*t);    
%构造的混合信号
Mix_Signal   = Signal_Original_1 + Noise_White_1;
figure(1);
subplot(211);
plot(t,Mix_Signal);
xlabel('时间t(s)');
title('带噪声信号');

%快速傅里叶变换
Y = fft(Mix_Signal);
P2 = abs(Y/N); 
% 计算双侧频谱 P2
P1 = P2(1:N/2+1);	
% 将P2的前半段信号赋给P1,P1即是我们关心的部分
P1(2:end-1) = 2*P1(2:end-1);
%计算每个信号的双侧频谱和单侧频谱。
f = fs*(0:(N/2))/N;%采样频率fs,因此只看fs/2内的信号
subplot(212);
plot(f,P1,'r');
title('带噪声信号');
xlabel('频率f(Hz)');
ylabel('|P1(f)|');

iir数字滤波器的原理_iir滤波器和fir滤波器

Step2:选择需要保留的频率,设计满足需求的滤波器;

根据上述示例,需要保存的频率为10Hz,选用低通滤波器,以IIR巴特沃斯低通滤波器为例,可选取截止频率为30Hz。通过代码确认满足需求的滤波器阶次。

其中,通带波纹:是指在滤波器的频响中通带的最大幅值和最小幅值的差,正常的滤波器一般通带纹波小于1db,不过也视情况而定,通带纹波会导致通带内的信号幅值大小有变化,对一些要求高的系统,纹波越小越好。通带纹波和滤波器的阶数有关系,阶数越大纹波越小。

阻带衰减:滤波器有部分频率是通,部分是阻。但是阻的部分,未必能够全部阻隔,而只有部分衰减,部分留下来,因此最小衰减就可以描述它阻碍该阻碍的波段的能力的高低(理想状态是100%衰减),最小衰减越大,则能力越好。

%IIR滤波器设计  
NN=0; % 阶数  
Fp=5; % 通带截止频率5Hz  
Fc=40; % 阻带截止频率30Hz  
Rp=1; % 通带波纹最大衰减为1dB,最好情况为1dB  
Rs=30; % 阻带衰减为30dB,截止频率的10倍频程时,衰减30dB,数值越大阻止能力越强。  
  
%计算最小滤波器阶数  
na=sqrt(10^(0.1*Rp)-1);  
ea=sqrt(10^(0.1*Rs)-1);  
NN=ceil(log10(ea/na)/log10(Fc/Fp)); 

Step3:使用fdatool(filterDesigner)工具箱,按照需求进行选择;

—>在MATLAB命令窗口输入 fdatool(或filterDesigner);

—>打开滤波器设计工具箱,设计选择低通,巴特沃斯 2阶 采样频率fs=1000,截止频率fc=50后,点击设计滤波器,选择[b,a]图标即可查看参数,但需要通过“编辑”选项,选择“转换为单节”,才能得到普遍意义上的滤波器系数,如图所示。

iir数字滤波器的原理_iir滤波器和fir滤波器

Step4:验证数字滤波器性能;

为验证滤波器设计是否达到效果,需要进行滤波验证。

首先,生成simulink单元模型—>选择iir数字滤波器的原理_iir滤波器和fir滤波器,选择使用基本元素构建模型,点击实现模型。

iir数字滤波器的原理_iir滤波器和fir滤波器

iir数字滤波器的原理_iir滤波器和fir滤波器

以此得到滤波器系数b,a,在MATLAB中形成代码如下:

a2=-1.734725714;
a3=0.7660065889;
b1=0.007820207626;
b2=0.01564041525;
b3=0.007820207626;

delay0=0;
delay1=0;
delay2=0;
for i = 1:N
    delay0 = Mix_Signal(i)-a2*delay1-a3*delay2;
    output(i) = b1*delay0+b2*delay1+b3*delay2;
    delay2=delay1;
    delay1=delay0;
end
hold on;
figure(2);
subplot(211);
plot(t,output);
xlabel('时间t(s)');
title('滤波后信号');

%快速傅里叶变换
OY = fft(output);
P21 = abs(OY/N); 
% 计算双侧频谱 P2
P11 = P21(1:N/2+1);	
% 将P2的前半段信号赋给P1,P1即是我们关心的部分
P11(2:end-1) = 2*P11(2:end-1);
%计算每个信号的双侧频谱和单侧频谱。
f = fs*(0:(N/2))/N;%采样频率fs,因此只看fs/2内的信号
subplot(212);
plot(f,P11,'');
title('滤波后信号');
xlabel('频率f(Hz)');
ylabel('|P11(f)|');

iir数字滤波器的原理_iir滤波器和fir滤波器

对比原信号和滤波后信号:

figure(3);
plot(t,[s0;output]);
legend('原信号','IIR滤波后信号');
xlabel('时间t(s)');
title('信号');

iir数字滤波器的原理_iir滤波器和fir滤波器

结果分析:截止频率选择30Hz时,幅值上没有衰减,相位上存在一定滞后。也说明数字滤波器在采样后与模拟滤波器存在一定差异。

三、基于stm32的嵌入式应用及代码

为了应用于stm32,需要重复目录二。

import通过jscope或采集系统得到的时域数据,设置采样频率与上述设备一致,设置一周期以上时宽后,进行傅里叶变换(fft),确定截止频率fc,从而设计滤波器,通过滤波器工具箱得到滤波系数。

点击目标,生成C头文件,选择导出类型为单精度即可满足stm32需求。

iir数字滤波器的原理_iir滤波器和fir滤波器

生成C头文件后,用VSCode打开,得到滤波器系数如下:

const int NL = 3;
const real32_T NUM[3] = {
   0.007820207626,  0.01564041525, 0.007820207626
};
const int DL = 3;
const real32_T DEN[3] = {
                1,   -1.734725714,   0.7660065889
};

在stm32中实现对应程序如下:

static float NUM[3]={0.007820207626,  0.01564041525, 0.007820207626};
static float DEN[3]={1,-1.734725714,0.7660065889};
//子函数
float IIR_LPF_FILTER(float input,float* NUM,float* DEN)
{
    float output;
    static float delay[3]={0};
    delay[0] = input - DEN[1]*delay[1]-DEN[2]*delay[2];
    output = NUM[0]*delay[0]+NUM[1]*delay[1]+NUM[2]*delay[2];
    delay[2]=delay[1];
    delay[1]=delay[0];
    return output;
}
//主函数调用
void main()
{
  float input;
  input = sdp();
  IIR_LPF_FILTER(input,NUM,DEN);
} 

至此,即完成了基于STM32的二阶直接II型巴特沃斯低通滤波器。

参考:

https://zhuanlan.zhihu.com/p/357619650

一文看懂MATLAB 滤波器设计(IIR滤波器、FIR滤波器)及单片机实现 – 知乎 (zhihu.com)

MATLAB中FFT的用法 – 知乎 (zhihu.com)

通带纹波、阻带纹波、通带最大波纹和阻带最小衰减-CSDN博客

今天的文章iir数字滤波器的原理_iir滤波器和fir滤波器分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80063.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注