mcpField
M
matlab-design-digital-filter

matlab-design-digital-filter

github.com/matlab数据与数据库1.2k118 次安装1 天前更新
代码仓库

关于 matlab-design-digital-filter

面向信号处理任务的 MATLAB 技能,用于设计和验证数字滤波器,涵盖架构选择、代码生成与数值验证。

主要功能

  1. 01选择 FIR 和 IIR 架构
  2. 02设计低通、高通、带通、带阻和陷波器
  3. 03支持流式与离线滤波工作流
  4. 04比较滤波器并验证响应

适用场景

  1. 01去除信号中的噪声或干扰
  2. 02比较候选滤波器设计
  3. 03设计窄过渡带滤波器
  4. 04构建实时或批处理滤波流程

MCP 相关

工作流通过 MCP 分析输入数据,包括频谱、信号长度和干扰位置。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-design-digital-filter

安装后在 Claude Code 中输入/matlab-design-digital-filter确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

manifest.yaml
references/
best-practices.md
efficient-filtering.md
filter-analyzer.md
INDEX.md
multirate.md
multistage-ifir.md
patterns.md
references/quick-ref/
designfilt.md
efficient-filtering.md
filter-analyzer.md
general-iir-fir.md
multirate-offline.md
multirate-streaming.md
multistage-ifir.md

详细介绍

在 MATLAB 中设计数字滤波器

使用 Signal Processing Toolbox 和 DSP System Toolbox 设计、实现并验证数字滤波器。选择合适的架构(单级或高效替代方案),生成正确的代码,并通过图表和数值验证结果。

适用场景

  • 设计低通、高通、带通、带阻或陷波滤波器
  • 清理含噪信号或消除干扰
  • 在 FIR 和 IIR 滤波器架构之间进行选择
  • 在 Filter Analyzer 中比较滤波器设计
  • 构建流式(实时)或离线(批处理)滤波流水线
  • 使用多速率或 IFIR 方法处理窄过渡带

不适用场景

  • 自适应滤波(LMS、RLS)——直接使用 Signal Processing Toolbox 文档
  • 音频专用处理(均衡、房间校正)——使用 Audio Toolbox
  • 图像滤波(二维卷积、形态学运算)——使用 Image Processing Toolbox
  • 不涉及滤波的一般频谱分析——FFT/periodogram 文档即可满足需求

关键规则

  • 编写任何滤波器设计代码前,先阅读 references/INDEX.md。
  • **始终写入 .m 文件。**绝不要将多行 MATLAB 代码直接放入 evaluate_matlab_code。将代码写入 .m 文件,通过 run_matlab_file 运行,出错时再进行修改。
  • **调用任何 MATLAB 函数前都要进行预检。**在调用 INDEX.md 中列出的任何函数之前,先阅读所需的快速参考。请在回复开头注明 Preflight: [files]。
  • **不要猜测关键要求。**如果未说明 Mode(流式还是离线)或 Phase 要求,请先询问。
  • **未提供 Fs 时,不得设计 Hz 滤波器。**如果 Fs 未知,请停止并询问(除非用户明确要求使用归一化频率)。
  • **始终固定采样率。**使用 designfilt(..., SampleRate=Fs) 和 freqz(d, [], Fs)。
  • **IIR 稳定性:**优先使用 SOS/CTF 形式(避免高阶 [b,a] 多项式)。
预检流程
  1. 列出要调用的 MATLAB 函数
  2. 在 references/INDEX.md 中逐一查找(函数级和任务级表格)
  3. 阅读所需的快速参考文件
  4. 在回复开头注明:Preflight: quick-ref/filter-analyzer.md, quick-ref/designfilt.md(或 Preflight: none required)

工作流

阶段 1:信号分析
  • 通过 MCP 分析输入数据(频谱、信号长度、干扰位置)
  • 计算 trans_pct 并识别干扰特征
阶段 2:明确意图

完成信号分析后,如果未说明,请询问 Mode 和 Phase:

  • Mode:streaming(因果)| offline(批处理)
  • Phase:zero-phase(零相位)| linear-phase(线性相位)| don't-care(无要求)

收到答复后,再展示任何方案比较或概述。

阶段 3:选择架构
  • 如果 trans_pct < 2%,请打开 references/efficient-filtering.md
  • 仅展示符合 Mode 和 Phase 约束的可行候选方案
  • 明确列出排除的类型,并用一句话说明原因
  • 使用 Filter Analyzer 进行可视化比较

设计需求检查清单

必需的信号与频率规格(缺少时无法继续)
  • Fs(Hz)
  • 响应类型:lowpass / highpass / bandpass / bandstop / notch
  • 边缘频率(Hz)

如果缺少任何一项,请询问。

架构选择所需的意图信息(未知时请询问)
  • Mode:streaming(因果)| offline(批处理)
  • Phase:zero-phase(零相位)| linear-phase(线性相位)| don't-care(无要求)
  • 幅度约束:Rp_dB 通带纹波(默认 1 dB),Rs_dB 阻带衰减(默认 60 dB)

如果 Mode 或 Phase 未知,请提出 1 到 2 个澄清问题,然后停止。

架构检查点

确定方案前,先计算并说明:

  • trans_bw = Fstop - Fpass
  • trans_pct = 100 * trans_bw / Fs
  • M_max = floor(Fs/(2*Fstop))(仅适用于基于低通的多速率方案)

判定规则:

  • trans_pct > 5% —— 通常采用单级 FIR 或 IIR 即可
  • 2% <= trans_pct <= 5% —— 可以采用单级方案;如果成本或延迟很重要,请提及高效替代方案
  • trans_pct < 2% —— 停止并进行窄过渡带方案比较(参见 references/quick-ref/efficient-filtering.md)

设计 + 验证

  1. 可行性检查 -- 让 designfilt 选择最低阶数,然后查询 filtord(d)。也可以使用 kaiserord/firpmord 估算 FIR 长度。
  2. 设计候选方案 -- 优先使用带显式 Rp/Rs 和 SampleRate=Fs 的 designfilt()。对于流式 IIR,使用 SystemObject=true。对于离线零相位滤波,可以使用 filtfilt(),但要说明它会使幅度响应平方。
  3. 直观比较 -- 使用 filterAnalyzer() 比较 2 个或更多设计。先阅读 references/quick-ref/filter-analyzer.md。至少显示:幅度 + 群延迟。
  4. 用数值验证 -- 检查通带最坏波纹和阻带衰减是否符合规格。对于 filtfilt(),验证有效响应(幅度平方)。
  5. 交付输出 -- 规格摘要、推导出的指标、所选架构及原因、MATLAB 代码、验证代码片段 + 结果、实现形式。

关键函数

函数用途
designfilt()主要滤波器设计(FIR 和 IIR,所有响应类型)
filterAnalyzer()直观比较 2 个或更多滤波器设计
freqz()、grpdelay()频率响应和群延迟分析
filtfilt()离线零相位滤波
dsp.SOSFilter使用 SystemObject=true 实现流式 IIR
designMultirateFIR()多速率抽取器/插值器设计
ifir()在速率不变时,用于窄过渡带的插值 FIR
cost()DSP System 对象上的 MPIS(每输入样本乘法次数)
kaiserord()、firpmord()FIR 阶数估算

约定

  • 在 designfilt() 中始终指定 SampleRate=Fs,并使用 freqz(d, [], Fs) 以 Hz 为单位绘图
  • 多滤波器比较使用 filterAnalyzer(),不要绘制自定义的 freqz/grpdelay 图
  • IIR 使用 SOS 形式(阶数 > 8 时避免使用 [b,a])
  • 多面板图形使用 tiledlayout/nexttile(不要使用 subplot)

Copyright 2026 The MathWorks, Inc.


评论

支持 Markdown