首页 综合问答 第四节0的定义与分类(二)--0.1滤波器

第四节0的定义与分类(二)--0.1滤波器

发布时间:2022-09-27 14:47:12 浏览:96 分类:综合问答

前言

本文内容相对独立。它解释了常用的滤波器设计,将用于双足机器人的传感器数据处理。如果您想直接使用它,请参阅第 4 节。

0 过滤器的定义和分类0.1 过滤器定义

滤波器是一种频率选择设备,它允许信号中的特定频率分量通过,同时大大衰减其他频率分量。利用该滤波器的选频功能,可以滤除干扰噪声或进行频谱分析。

0.2过滤分类

根据处理的信号类型可分为

根据信号的频段,可以将信号分为

过滤器

1 个过滤器的关键指标

--通带截止频率

- -阻带截止频率

--通带衰减--通带内幅值响应最大值与最小值之比的对数;

--阻带衰减--阻带中的最大幅度响应与通带中的最大幅度响应之比的对数

-- 3db截止频率,此时幅度响应是通带内最大幅度响应的一半这些参数在设计模拟滤波器时非常重要;

2 设计模拟滤波器步骤2.1 常用模拟滤波器

2.2巴特沃斯滤波器设计--查表法设计

k_{sp} = sqrt{ {frac{10^{0.1}-1}{10^{0.1}-1}} } \ {sp} = frac{{}}{} \ N = frac{lg{k_{sp}}}{lg{{sp}}}

\ {c} = {p}{(10^{}-1)}^{-frac{1}{2N}}

经过以上步骤低通滤波器设计,可以得到特定指标的低通滤波器;

2.3 个设计示例

3 数字滤波器3.1 数字信号与模拟信号的关系

omega = Omega{T_s} = 2pi frac{f}{f_s}

因为f_s通常是模拟信号频率f的两倍以上,所以数字信号的频率通常小于pi

3.2 IIR 滤波器设计3.2.1 IIR 滤波器定义

IIR滤波器,也称为无限脉冲响应数字滤波器,滤波器的阶数由分母的阶数决定

IIR数字滤波器的微分方程

3.2.2 IIR滤波器设计方法3.2.3 IIR滤波器设计采用脉冲响应不变法

3.2.4 使用双线性变换设计IIR滤波器

s = frac{1-z^{-1}}{1 + z^{-1}} 得到离散方程

3.3 FIR 滤波器设计3.3.1 FIR 滤波器定义

FIR滤波器是非递归滤波器的缩写,也称为有限长度单位脉冲响应滤波器。具有恒定系数的 FIR 滤波器是 LTI(线性时不变)数字滤波器。脉冲响应是有限的,意味着滤波器中没有反馈。长度为 N 的 FIR 的输出与输入时间序列 x(n) 对应的关系由以下形式的有限卷积和给出:

3.3.2 FIR滤波器设计

4 如何在工程中快速设计软件数字滤波器4.1 已知信号设计滤波器4.1.1 使用工具快速设计

频率主要集中在前10HZ,因为我知道我的输入在0.1HZ,所以设置通带截止频率为0.15HZ,幅度为3dB,阻带截止频率到1.5hz,幅度衰减20dB

clc;
clear;
close all;
cop_right = load("cop_right.txt");
cop_left = load("cop_left.txt");
plot(cop_right(:,3));
hold on;
plot(cop_left(:,3));
[f,X_m,X_phi] = DFT(cop_right(:,3),0.01);

DFT函数如下

function [f,X_m,X_phi] = DFT(xn,ts,N,drawflag)
% [f,X_m,X_phi] = DFT(xn,ts,N,drawflag) 离散序列的快速傅里叶变换,时域转换为频域
% 输入  xn为离散序列 为向量  
%       ts为序列的采样时间/s
%       N为FFT变换的点数,默认为xn的长度  
%       drawflag为绘图标识位,取0时不绘图,其余非0值时绘图,默认为绘图
% 输出 f为频率向量
%      X_m为幅值向量
%      X_phi为相位向量,单位为°
% 注意计算出来的0频分量(直流分量应该除以2)  直流分量的符号应结合相位图来确定
% By ZFS@wust  2020
% 获取更多Matlab/Simulink原创资料和程序,清关注微信公众号:Matlab Fans
if nargin == 2
    N = length(xn);
    drawflag = 1;
elseif  nargin == 3
    drawflag = 1;
end
if  isempty(N)
    N = length(xn);
end
Xk = fft(xn,N);         % FFT变换
fs = 1/ts;              % 采样频率 HZ
X_m = abs(Xk)*2/N;      % 幅值量化变换
X_phi = angle(Xk);      % 相位
Nn = floor((N-1)/2);    % 变换后有用的点数-1
f = (0:Nn)*fs/N ;       % 横坐标 频率HZ
X_m = X_m(1:Nn+1);      % 幅值(仅取有用点Nn个点)
X_phi = X_phi(1:Nn+1);  % 相位(仅取有用点Nn个点)
% X_phi = unwrap(X_phi);  % 去除相位的间断点(仅在出图时作用)
X_phi = X_phi*180/pi;   % 化成°单位
% 直流分量处理
X_m(1) = X_m(1)/2;      % 注意计算出来的0频分量(直流分量应该除以2)
if drawflag ~= 0        
    figure
    subplot(211)
    plot(f,X_m)
    title('DFT的频率-幅值图');
    xlabel('频率/HZ');ylabel('幅值');
    grid on
    subplot(212)
    plot(f,X_phi)
    title('DFT的频率-相位图');
    xlabel('频率/HZ');ylabel('相位/°');
    grid on
end

路径为文件---生成代码---滤波器设计函数,保存的函数名称为.m

function Hd = low_pass_filter
%LOW_PASS_FILTER 返回离散时间滤波器对象。
% MATLAB Code
% Generated by MATLAB(R) 9.8 and DSP System Toolbox 9.10.
% Generated on: 10-Nov-2021 13:59:30
% Butterworth Lowpass filter designed using FDESIGN.LOWPASS.
% All frequency values are in Hz.
Fs = 100;  % Sampling Frequency
Fpass = 0.15;        % Passband Frequency
Fstop = 1.5;         % Stopband Frequency
Apass = 3;           % Passband Ripple (dB)
Astop = 20;          % Stopband Attenuation (dB)
match = 'stopband';  % Band to match exactly
% Construct an FDESIGN object and call its BUTTER method.
h  = fdesign.lowpass(Fpass, Fstop, Apass, Astop, Fs);
Hd = design(h, 'butter', 'MatchExactly', match);
% [EOF]

可以在函数文件中调用

clc;

matlab 低通滤波 高通滤波_低通滤波电路设计_低通滤波器设计

clear; close all; cop_right = load("cop_right.txt"); plot(cop_right(:,3)); hold on; % 定义生成的低通滤波器 x = low_pass_filter; cop_right_filter = filter(x,cop_right(:,3)); hold on; plot(cop_right_filter);

4.1.c++中的2个过滤器实现

对于上面设计的IIR形式的低通滤波器,它的形式就是上面的信息,

滤波器为直接型II,二阶截面,即滤波器由许多串联的二阶系统表示,阶为1,截面为1,表示滤波器表示如类型II,阶数如果为1,则表示H(Z)的最高阶数为1,如果截面为1,则表示滤波器只有一个串联的二阶系统;二阶系统的系数定律如下图所示;

可以总结为如下公式,k代表第K个二阶系统的系数,x代表输入,y代表输出,w代表中间变量w_k(n) = x_k(n) - a_{1k} w_{k}(n-1) - a_{2k}w_{k}(n-2) y_{k}(n) = w_k(n) - b_{1k} w_{k}(n-1) - b_{2k}w_{k}(n-2) x_{k+1}(n) = K_{ gain}y_{k} (n) 当 tree不为1时,上一个的输出可以作为下一个order的输入

/*
 * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
 * Generated by MATLAB(R) 9.8 and Signal Processing Toolbox 8.4.
 * Generated on: 10-Nov-2021 14:22:20
 */
/*
 * 离散时间 IIR 滤波器(实数)
 * ----------------
 * 滤波器结构  : 直接 II 型,二阶节
 * 节数     : 1
 * 稳定     : 是
 * 线性相位   : 否
 */
/* General type conversion for MATLAB generated C-code  */
/* 
 * Expected path to tmwtypes.h 
 * C:Program FilesMATLABR2020aexternincludetmwtypes.h 
 */
#define MWSPT_NSEC 3
const int NL[MWSPT_NSEC] = { 1,2,1 };
/// 分子系数 NUM
const double NUM[MWSPT_NSEC][3] = {
  {
   0.004717279822617,                 0,    0
  },
  {
                   1,                 1 ,   0
  },
  {
                   1,                 0 ,   0
  }
};
const int DL[MWSPT_NSEC] = { 1,2,1 };
/// 分母系数
const double DEN[MWSPT_NSEC][23] = {
  {
                   1,                 0,     0
  },
  {
                   1,  -0.9905654403548,     0 
  },
  {
                   1,                 0 ,    0
  }
};

在软件设计过程中,每个二阶段的延迟变量只取 和 ,并在过程中直接将其赋值为中间变量。这是因为下一个输入数据n+1的延迟变量是前一个输入数据的总和。这样设计可以节省寄存器空间。为了提高处理速度,程序需要使用指针进行参数传递,特别注意二维数组首地址的传递方式是&a[0][0]->*a。低通滤波器设计,注意a矩阵是分母,b矩阵是分子,w最好定义为形式;

double iir(double *a, double *b,double* w, double xin, int N_IIR)
{
    int k;
double temp = xin;
for (k = 0; k<N_IIR; k++)
{
    *(w+k*3) = temp - *(a + 3+6 * k  + 1) *(*(w + k * 3+1)) - *(a + 3 + 6 * k + 2) *(*(w + k * 3+2));
         //这里temp为本二阶节的输入,也是上一个二阶节的输出

         temp = *(b + 3 + 6 * k )* (*(w + k * 3)) + *(b + 3 + 6 * k + 1) * (*(w + k * 3+1)) + *(b + 3+6 * k + 2)* (*(w + k * 3+2));
//这里temp为本二阶节的输出,也是下一个二阶节的输入

         *(w + k * 3 + 2) = *(w + k * 3 + 1);
         *(w + k * 3 + 1) = *(w + k * 3);
         temp = temp*(*(b + 6 * k));//放大倍数,稳定信号

}
return temp;
}
void main()
{
    const int N = 100;
    int i,j;
    double xn[N];
    double w[20][3];
    double yn[N];
    ///w的行数为滤波器的节数
    for (i = 0; i < 20; i++)//初始化
    {
        for (j = 0; j < 3; j++)
            w[i][j] = 0;
    }
    for (i = 0; i < N; i++)
    {
        ///这里把你要处理的信号放进去就可以了
        xn[i] = sin(2 * 3.1416 * 20 / 50 * i)+ sin(2 * 3.1416 * 2 / 50 * i)+ sin(2 * 3.1416 * 11 / 50 * i);
        yn[i]=iir(&DEN[0][0], &NUM[0][0], &w[0][0],xn[i], 20);
    }
    ofstream SaveFile_a("xn.txt");
    for (i = 0; i<N; i++)
        SaveFile_a << " " << xn[i] << endl;
    SaveFile_a.close();
    ofstream SaveFile_b("yn.txt");
    for (i = 0; i<N; i++)
        SaveFile_b << " " << yn[i] << endl;
    SaveFile_a.close();
}

4.2 已知的通带阻带设计滤波器

信号频谱分析步骤省略,其余同4.1

的设计方法

5 参考文献

设计一个低通滤波器

没有前途的青年:实现一阶低通滤波器

使用离散傅里叶变换进行光谱分析

设计一个低通滤波器并手动实现

IIR 滤波器软件实现(+C++)

IIR滤波器和c++实现

FIR 和 c++ 实现

直接类型 I 和直接类型 II 过滤器的实现

IIR 滤波器实现(C++)​