资讯详情

资讯详情

巴特沃斯滤波算法深度解析

基本概念巴特沃斯滤波器由英国工程师 Stephen Butterworth 提出属于 IIR 滤波器。IIR无限冲激响应输出不仅依赖当前、历史输入还依赖历史输出存在反馈回路。FIR 无反馈仅使用输入数据。关键术语阶数 N滤波器阶数阶数越高阻带衰减越快计算开销越大相位失真越严重。截止频率-3dB 截止频率幅度下降到通带 0.707 倍处的频率点。采样频率原始信号采样频率。双线性变换模拟滤波器转数字滤波器手段会产生频率畸变需要预畸变校正截止频率。预畸变补偿双线性变换带来的频率扭曲保证实际截止频率和设计目标一致。a 系数、b 系数IIR 滤波器差分方程分母、分子系数。零相位滤波 filtfilt正向滤波完成后反向再次滤波抵消 IIR 带来相位偏移适合离线数据不可用于实时。注意巴特沃斯本身是滤波器设计算法不是直接滤波函数需要先算出 a、b 系数再运行差分方程完成滤波计算。历史背景1930 年Stephen Butterworth 在论文《On the Theory of Filter Amplifiers》首次提出巴特沃斯模拟滤波器。 在模拟电路时代使用电阻电容电感搭建数字信号处理发展后通过双线性变换把模拟原型转化为数字滤波器广泛应用。 对比同期滤波器切比雪夫 I/II、椭圆滤波器牺牲通带 / 阻带平坦换取更快衰减贝塞尔滤波器优先保证线性相位。巴特沃斯选择通带最大平坦作为核心设计目标折中衰减速度与波纹。核心原理模拟巴特沃斯幅度平方函数模拟域幅度平方响应N滤波器阶数模拟角频率模拟截止角频率 (-3dB)极点全部分布在 s 平面左半平面的单位圆上取左半平面极点构造稳定传递函数。双线性变换 预畸变模拟 S 域转数字 Z 域双线性变换公式采样周期。 双线性变换会压缩频率轴必须做预畸变校正截止频率把目标数字截止频率映射回模拟域再做变换保证最终数字滤波器截止频率准确。数字 IIR 传递函数差分方程滤波运算核心时域递归计算公式输入原始信号滤波输出信号分子系数分母系数实时滤波只能正向递归会产生相位滞后 离线零相位滤波正向滤波→将输出序列反转→再次滤波→再反转得到结果相位偏移完全消除。执行流程完整巴特沃斯数字滤波完整流程输入参数滤波器阶数 N采样频率截止频率原始输入信号数组。预畸变计算模拟截止角频率校正双线性变换频率扭曲。求解模拟巴特沃斯原型极点。通过双线性变换将模拟极点映射为 Z 域极点。计算得到数字滤波器分子系数 b、分母系数 a。系数归一化保证直流增益为 1。滤波运算实时模式正向递归差分方程计算输出离线模式执行 filtfilt 双向零相位滤波。返回滤波完成信号。⚠️注意阶数不要设置过大一般工程 2~8 阶阶数过高系数精度敏感容易造成滤波器不稳定。算法性能分析时间复杂度和 FIR 相比达到同等阻带衰减IIR 巴特沃斯需要阶数远小于 FIR计算开销更低。系数求解N 为滤波器阶数滤波运算每一个采样点运算量信号长度 M总复杂度。空间复杂度存储 a、b 系数与历史输入输出缓存。稳定性只要极点全部落在 Z 平面单位圆内滤波器稳定阶数过高、浮点精度不足会造成极点漂移出现震荡发散。相位特性普通正向巴特沃斯非线性相位信号不同频率分量时间延迟不一致波形会发生相位畸变实时采集传感器场景要重视。filtfilt 双向滤波零相位但延迟等于全部信号长度只适合离线。频率特性✅通带幅度响应最大平坦无波纹❌阻带衰减速度不如切比雪夫滤波器阶数每提升 1 阶阻带增加 20dB / 十倍频衰减。C# 完整代码无任何第三方库功能巴特沃斯低通滤波器包含系数计算、正向实时滤波、filtfilt 零相位双向滤波。 仅使用.NET 原生 System不引用信号处理库。using System; using System.Collections.Generic; namespace ButterworthFilter { /// summary /// 巴特沃斯低通IIR滤波器无第三方库 /// /summary public class ButterworthLowpass { /// summary /// a系数 分母 a[0]1 /// /summary public double[] A { get; private set; } /// summary /// b系数 分子 /// /summary public double[] B { get; private set; } private readonly int _order; private readonly double _fs; private readonly double _fc; /// summary /// 构造巴特沃斯低通 /// /summary /// param nameorder阶数建议2~8/param /// param namefs采样频率 Hz/param /// param namefc-3dB截止频率 Hz/param public ButterworthLowpass(int order, double fs, double fc) { if (fc 0 || fs 0) throw new ArgumentException(频率必须大于0); if (fc fs / 2) throw new ArgumentException(截止频率必须小于奈奎斯特频率 fs/2); _order order; _fs fs; _fc fc; ComputeCoefficients(); } /// summary /// 计算巴特沃斯数字滤波器系数双线性变换预畸变 /// /summary private void ComputeCoefficients() { double T 1.0 / _fs; // 1.预畸变截止频率 double wd 2 * Math.PI * _fc; double wa (2.0 / T) * Math.Tan(wd * T / 2.0); // 2.模拟巴特沃斯极点 ListComplex sPoles new ListComplex(); for (int k 0; k _order; k) { double angle Math.PI * (_order 2 * k 1) / (2 * _order); double real -wa * Math.Cos(angle); double imag wa * Math.Sin(angle); sPoles.Add(new Complex(real, imag)); } // 3.双线性变换 s→z ListComplex zPoles new ListComplex(); foreach (var s in sPoles) { // z (2/T s) / (2/T - s) Complex twoOverT new Complex(2.0 / T, 0); Complex z (twoOverT s) / (twoOverT - s); zPoles.Add(z); } // 4.由极点构造分母多项式A Complex[] aPoly { new Complex(1, 0) }; foreach (var p in zPoles) { aPoly PolyMultiply(aPoly, new[] { new Complex(1, 0), -p }); } // 5.低通分子多项式全部零点位于 z-1 Complex[] bPoly { new Complex(1, 0) }; for (int i 0; i _order; i) { bPoly PolyMultiply(bPoly, new[] { new Complex(1, 0), new Complex(1, 0) }); } // 转为double数组归一化增益 A Array.ConvertAll(aPoly, c c.Real); B Array.ConvertAll(bPoly, c c.Real); // 直流增益归一化 z1代入 H(z) double gainB 0; double gainA 0; foreach (var v in B) gainB v; foreach (var v in A) gainA v; double gain gainB / gainA; for (int i 0; i B.Length; i) B[i] / gain; } /// summary /// 多项式复数乘法 /// /summary private Complex[] PolyMultiply(Complex[] p1, Complex[] p2) { Complex[] res new Complex[p1.Length p2.Length - 1]; for (int i 0; i res.Length; i) res[i] new Complex(0, 0); for (int i 0; i p1.Length; i) for (int j 0; j p2.Length; j) res[i j] p1[i] * p2[j]; return res; } /// summary /// 正向滤波实时可用带相位延迟 /// /summary /// param nameinput输入信号数组/param /// returns滤波输出/returns public double[] FilterForward(double[] input) { int n input.Length; double[] output new double[n]; int lenA A.Length; int lenB B.Length; for (int i 0; i n; i) { double sumB 0; for (int k 0; k lenB; k) { int idx i - k; if (idx 0) sumB B[k] * input[idx]; } double sumA 0; for (int k 1; k lenA; k) { int idx i - k; if (idx 0) sumA A[k] * output[idx]; } output[i] sumB - sumA; } return output; } /// summary /// filtfilt 零相位双向滤波仅适合离线数据 /// 正向滤波→反转→滤波→反转 /// /summary public double[] FilterFiltFilt(double[] input) { double[] y1 FilterForward(input); Array.Reverse(y1); double[] y2 FilterForward(y1); Array.Reverse(y2); return y2; } #region 内部复数结构体不依赖System.Numerics private struct Complex { public double Real { get; } public double Imag { get; } public Complex(double real, double imag) { Real real; Imag imag; } public static Complex operator (Complex a, Complex b) { return new Complex(a.Real b.Real, a.Imag b.Imag); } public static Complex operator -(Complex a, Complex b) { return new Complex(a.Real - b.Real, a.Imag - b.Imag); } public static Complex operator *(Complex a, Complex b) { double r a.Real * b.Real - a.Imag * b.Imag; double i a.Real * b.Imag a.Imag * b.Real; return new Complex(r, i); } public static Complex operator /(Complex a, Complex b) { double den b.Real * b.Real b.Imag * b.Imag; double r (a.Real * b.Real a.Imag * b.Imag) / den; double i (a.Imag * b.Real - a.Real * b.Imag) / den; return new Complex(r, i); } } #endregion } // 测试示例 class Program { static void Main(string[] args) { int fs 1000; //采样频率1000Hz double fc 10; //截止频率10Hz int order 4; //4阶巴特沃斯低通 ButterworthLowpass filter new ButterworthLowpass(order, fs, fc); //构造测试信号5Hz50Hz高频噪声 Listdouble signal new Listdouble(); for (int t 0; t 2000; t) { double s1 Math.Sin(2 * Math.PI * 5 * t / fs); double s2 0.4 * Math.Sin(2 * Math.PI * 50 * t / fs); signal.Add(s1 s2); } double[] resForward filter.FilterForward(signal.ToArray()); double[] resFiltFilt filter.FilterFiltFilt(signal.ToArray()); Console.WriteLine(A系数 string.Join(,, filter.A)); Console.WriteLine(B系数 string.Join(,, filter.B)); Console.WriteLine(完成滤波); } } }代码说明内置自定义Complex复数结构体不引入 System.Numerics完全原生实现双线性变换 预畸变正确生成巴特沃斯低通 a、b 系数FilterForward正向递归滤波适合嵌入式、实时传感器数据流FilterFiltFilt零相位双向滤波离线数据分析消除相位偏移Main 函数提供测试案例混合 5Hz 有效信号 50Hz 噪声演示滤波效果。扩展提示高通、带通、带阻可以在模拟原型完成频率变换后再执行双线性变换。优缺点优点✅通带幅度最大平坦通带无波纹这是巴特沃斯最核心优势✅同等衰减条件下对比 FIR 滤波器阶数低计算量小✅设计直观仅需要阶数、截止频率两个核心参数✅模拟电路历史积累成熟数字实现工程普及度高。缺点❌IIR 固有非线性相位实时滤波会造成波形相位畸变❌阻带衰减速率一般同阶数衰减弱于切比雪夫滤波器❌阶数过高浮点精度问题会带来滤波器不稳定风险❌filtfilt 零相位滤波不能用于实时流数据需要完整全部输入序列❌瞬态响应差信号起始位置会有暂态震荡。适用场景✅适合场景传感器离线数据处理加速度、压力、温度等信号降噪使用 filtfilt 零相位对通带波纹要求严格不希望通带内信号幅度起伏资源受限嵌入式设备希望低计算开销实现滤波能够接受相位滞后音频信号预处理。❌不适合场景需要严格线性相位的实时系统推荐 FIR 滤波器需要陡峭阻带衰减、资源充足场景优先切比雪夫高阶实时闭环控制相位偏移会影响闭环稳定性。总结巴特沃斯滤波属于IIR 数字信号处理算法分为滤波器系数设计算法与差分方程递归滤波运算两部分。核心设计目标是通带幅度最大平坦。工程选型权衡点通带无波纹换取阻带衰减能力同时牺牲相位线性度。 实时场景使用正向滤波接受相位延迟离线分析优先 filtfilt 双向零相位滤波阶数工程推荐 2‑8 阶。C# 原生实现无需第三方库可直接迁移到嵌入式仿真、上位机信号解析项目。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →