首页/文章/ 详情

2-44 一套 GUI,怎样完成基本信号、卷积、频谱和 IIR 滤波器分析?

1天前浏览19
一句话介绍: 这套 MATLAB GUIDE 程序把数字信号处理中的四类基础实验集中到一个主界面中:可以生成抽样、正弦、矩形和方波信号,比较线性卷积、圆周卷积与补零卷积,利用 FFT 同时观察时域、幅频和相频特性,并按通带、阻带与衰减指标设计低通、高通、带通和带阻 IIR 滤波器。

先看它解决什么问题

学习数字信号处理时,很多知识点单独看并不复杂,真正麻烦的是:

信号公式写出来以后,波形到底是什么样?

线性卷积和圆周卷积为什么会得到不同长度的结果?

为什么补零以后,又能用 FFT 的方式得到线性卷积?

一段时域信号经过 FFT 后,幅度和相位应该怎样观察?

给定通带、阻带和衰减指标以后,IIR 滤波器如何自动确定阶数并画出响应?

当前工程没有把这些步骤硬拼成一条处理流水线,而是设计成四个相互独立的实验入口:

DspToolbox主界面 → 基本信号 / 卷积计算 / FFT / IIR 滤波器

因此它更适合作为一套数字信号处理基础实验与算法演示工具,而不是面向某一种固定业务数据的专用处理系统。

1. 当前工程真正包含哪四个模块?

主入口是 DspToolbox.m 与 DspToolbox.fig。主界面的四个按钮分别调用:


模块

关键文件

当前作用

基本信号

BasicSignal.m/.fig

生成并绘制 4 类典型信号

卷积计算

Juanji.m/.fig

比较线性卷积、圆周卷积和补零法

FFT

FFT.m/.fig

显示原始信号、幅频响应、相频响应及平方和

IIR 滤波器

IIR.m/.fig

按频率与衰减指标设计滤波器并查看多种响应

这是一套典型的 MATLAB GUIDE 工程:每个功能界面都由一个 .fig 文件负责布局,一个同名 .m 文件负责按钮、菜单和计算回调。

2. 基本信号模块到底能画什么?

BasicSignal 提供四种信号:

抽样信号;正弦波信号;矩形波信号;方波信号。

点击“确定”以后,程序统一使用:Fs = 128 Hz

并建立:1024 个时间采样点

时间范围约为:−4 s ~ 3.9922 s

随后根据当前下拉菜单选择计算信号并绘图。

当前源码真正执行的四个关系分别是:

抽样信号:y = A·sinc(2πBx − C)

正弦信号:y = A·sin(2πBx − C)

矩形脉冲:y = A·rectpuls(x − B, C)

方波:y = A·square(x − B, C)

这里最值得注意的是:

虽然三个输入框始终叫 A、B、C,但 B、C 在不同信号中的物理含义并不完全一样。

例如:

正弦波中 B 主要控制频率尺度,C 对应相位偏移;

矩形波中 B 是位置偏移,C 是脉冲宽度;

方波中 B 是时间偏移,而 C 作为 square 的第二个参数表示占空比百分数。

所以不能把 A、B、C 在四类信号中都理解成完全相同的“幅值、频率、相位”。

3. 基本信号模块默认从什么参数开始?

程序打开时默认选中抽样信号,并写入:


信号

A

B

C

抽样信号

1

1

0

正弦波

1

1

0

矩形波

1

0

2

方波

1

2

25

切换信号类型以后,GUI 会自动把相应默认值重新写入三个编辑框。

例如方波默认调用:y = square(x − 2, 25)

因此这里的 25 指的是 25% 占空比,不是频率。

对于希望观察参数变化的实验,这个模块最直接的玩法就是:

固定信号类型 → 修改 A/B/C → 重新绘图 → 比较幅度、位置、宽度或占空比变化

4. 卷积模块使用的是什么信号?

Juanji 没有让用户输入任意数值序列,而是在源码中固定准备了三组长度为 11 的离散信号。

三角形序列:0,1,2,3,4,5,4,3,2,1,0

方波序列:0,0,0,1,1,1,1,1,0,0,0

阶跃信号:1,1,1,1,1,1,1,1,1,1,1

用户可以分别给“信号 1”和“信号 2”选择其中任意一组,然后选择:

线性卷积;圆周卷积;补零法求线性卷积。

点击“确定”以后,三个坐标区分别显示:输入信号 1 → 输入信号 2 → 卷积结果

这使得同一组输入可以直接换一种卷积方式进行对照。

5. 线性卷积和圆周卷积在程序里有什么区别?

线性卷积直接调用:conv(s1,s2)

如果两个输入长度分别为 N 和 M,那么输出长度为:N + M − 1

当前三个内置信号长度都是 11,因此线性卷积结果有:21 个样本

它对应的核心关系可以简单写成:

y[n] = Σₖ x[k]·h[n−k]

圆周卷积则采用:ifft(fft(s1).*fft(s2))

由于这里两组信号长度相同,FFT 长度都是 11,因此得到的是:11 点圆周卷积

简单理解,线性卷积会完整保留序列两端向外展开的过程,而有限长度圆周卷积会把超出长度的部分“绕回”序列前端。

这也是为什么同一对输入信号做两种卷积时,结果不能直接认为是一样的。

6. 为什么补零以后又能得到线性卷积?

第三种方法是这个模块里最有教学价值的一步。

源码首先把第一组信号补到:N + M − 1个点。

再把第二组信号补到相同长度,然后进行:FFT → 频域逐点相乘 → IFFT

只要 FFT 长度满足:L ≥ N + M − 1

周期回绕就不会污染线性卷积所需的有效结果。

所以程序实际展示的是:

原始序列 → 补零到足够长度 → FFT → 频域相乘 → IFFT → 线性卷积结果

这也把数字信号处理里两个经常分开讲的知识点连接了起来:

卷积可以在时域直接计算,也可以在满足长度条件后转到频域通过乘法计算。

当前代码结果图的图例写成了“补零法求圆周卷积”,但菜单名称和实际补零长度对应的目标都是“补零法求线性卷积”,这里属于界面文字与算法目的之间的小差异。

7. FFT 模块默认分析什么信号?

FFT 界面默认参数来自 .fig 和源码:


参数

默认值

采样频率 Fs

12800 Hz

采样时间

0.01 s

采样点数 N

128

采样起点

12800

默认分析的不是一个固定单频正弦,而是一段扫频信号。

程序先生成:100 Hz → 10000 Hz的线性 chirp,再乘上:0.98ⁿ形式的衰减包络。

也就是说,默认 FFT 示例同时具有:

频率随时间变化;

振幅随采样点逐渐衰减;

两个特点。

在默认参数下:Δf = Fs / N = 100 Hz

因此相邻 FFT 频率采样点之间间隔约 100 Hz。

8. FFT 界面最终给出哪些结果?

点击“确定”以后,程序执行:fft(x,n)

并配合 fftshift 把零频率移动到频谱中央。

三个绘图区依次显示:原始时域信号;幅频响应;展相后的相频响应。

频率坐标被换算到:−Fs/2 ~ Fs/2附近,因此得到的是双边频谱。

这里并没有额外进行单边谱归一化,也没有把 FFT 幅值除以 N,所以界面显示的是:

经过fftshift后的原始 FFT 幅值,而不是常见教材中已经做过幅值归一化的单边幅度谱。

程序还计算:Σᵢ xᵢ²并显示在“信号功率”编辑框中。

从严格定义来说,源码这里得到的是有限数据段的平方和,更接近离散能量量度;它并没有再除以采样点数,因此不等同于通常定义的平均功率。

9. FFT 是否支持自己的 WAV 音频?

代码保留了 WAV 文件选择功能。

选择“音频”以后,程序通过文件选择框读取 WAV 数据,取第一声道,再根据当前采样率截取约:0.01 s的数据进行 FFT。

随后仍然输出:音频片段 → 时域波形 → 幅频响应 → 相频响应

这意味着 FFT 模块不仅可以看内置 chirp 示例,设计上也允许把分析对象换成 WAV 音频。

10. IIR 模块真正设计的是哪几类滤波器?

当前 IIR.fig 明确提供四种响应类型:

Lowpass;Highpass;Bandpass;Bandstop。

也就是:低通、高通、带通、带阻

程序会根据滤波器类型调整频率输入框。

以默认低通为例,界面启动后显示:

参数

默认值

Fs

24000 Hz

Fpass

4800 Hz

Fstop

6000 Hz

Gainpass

1 dB

Gainstop

80 dB

低通情况下必须满足:Fpass < Fstop < Fs/2

高通则要求:Fstop < Fpass < Fs/2

带通与带阻需要输入四个边界频率,程序也会检查这些频率之间的大小顺序以及奈奎斯特条件。

11. IIR 滤波器是怎样从指标得到系数的?

当前 GUI 可见的设计方法是:Butterworth Filter

点击“设计滤波器”后,程序首先使用:buttord

根据:通带边缘;阻带边缘;通带最大衰减;阻带最小衰减;

自动求出满足指标的最小滤波器阶数和截止频率。

然后调用:butter得到 IIR 系数:b、a

再用:freqz计算频率响应。

所以当前可见 Butterworth 设计链可以概括成:

频率指标 + 衰减指标 →buttord求最小阶数 →butter求系数 →freqz求响应 → GUI 绘图

这比手工先指定一个阶数再不断试参数,更适合用来观察“指标要求越严格,滤波器需要怎样变化”。

12. 一个滤波器设计完成后还能看什么?

IIR 界面没有只停在一张幅频图。

当前 .fig 中还提供了五个响应按钮:

幅频响应;相频响应;冲激响应;阶跃响应;零极点图。

相应源码分别使用:

freqz、angle 与 unwrap、impz、dstep、zplane

因此一组 IIR 系数得到以后,可以从几个不同角度观察它:

频率选择能力 → 相位变化 → 单位冲激响应 → 阶跃响应 → 零极点位置

其中零极点图尤其适合帮助理解 IIR 滤波器为什么具有递归特性,以及极点位置与系统稳定性之间的关系。

13. 当前 IIR 源码里有哪些必须公开的边界?

这一部分很重要,因为 .m 文件中保留了一些历史代码,而当前 .fig 已经没有完整暴露这些功能。

第一,当前界面实际只显示 Butterworth 设计方法

IIR.m 中还能看到:

Chebyshev I;Chebyshev II;Elliptic;

对应的单选按钮回调代码。

同时设计 switch 中也保留了 Chebyshev I、Chebyshev II 的计算分支。

但是当前 IIR.fig 的“设计方法”区域实际只存在:Butterworth Filter

因此不能把 Chebyshev I、Chebyshev II 和椭圆滤波器写成当前 GUI 已经可直接选择的完整功能。

更进一步,椭圆滤波器虽然有 method=4 的回调,但设计函数里没有对应的 case 41~44,所以这一部分本身也没有形成完整闭环。

第二,“固定阶数”界面目前没有真正进入设计算法

当前 GUI 能看到:

最小阶数;固定阶数;阶数输入框。

但现有 IIR.m 没有找到对应固定阶数设计逻辑,edit_step 也没有进入 butter 的实际阶数设置。

现有设计仍然是:

通过buttord等阶数估计函数自动计算最小阶数。

所以“固定阶数”目前更像保留下来的界面入口,而不是已完成的有效功能。

第三,打开 IIR 后应先重新点击一次“设计滤波器”

OpeningFcn 中界面显示的默认低通阻带频率是:6000 Hz

但内部第一次初始化滤波器系数时,变量 fstop1str 被设成了:3600 Hz

也就是说,刚打开窗口时已有的内部 b、a 与屏幕显示的 6000 Hz 参数并不完全对应。

点击一次“设计滤波器”后,程序才会重新从编辑框读取当前参数并设计。

因此实际使用时更稳妥的顺序是:

选择滤波类型 → 检查频率和衰减参数 → 点击“设计滤波器” → 再查看各类响应。

14. 工程里的音频文件是什么情况?

压缩包实际包含三段 WAV:


文件

声道

采样率

时长约

chirp.wav

1

8192 Hz

1.60 s

train.wav

1

8192 Hz

1.57 s

i.wav

2

11025 Hz

3.00 s

IIR.m 当前明确加载了:train.wav

并且信号来源菜单包含:chirp、train

15. 四个模块最终分别能得到什么?

整个程序的输出可以压缩成下面四组。

基本信号

输入:信号类型 + A/B/C

得到:对应连续绘制波形

卷积计算

输入:两组内置离散信号 + 卷积类型

得到:两个输入序列 + 卷积结果

FFT

输入:默认 chirp 或 WAV 音频片段 + 采样参数

得到:时域信号 + 双边幅度谱 + 相位谱 + 样本平方和

IIR

输入:滤波器类型 + 采样频率 + 通阻带边缘 + 通阻带衰减

得到:IIR 系数对应的幅频、相频、冲激、阶跃与零极点特性

所以这套 GUI 的核心价值并不是完成某一种复杂工程算法,而是把:

信号生成 → 卷积关系 → 傅里叶频域观察 → IIR 系统分析

几个数字信号处理基础知识放到了统一的交互入口中。

16. 哪些参数最值得修改?

如果用这套程序做数字信号处理实验,真正值得主动改变的是下面几类参数。


参数

当前值/示例

为什么值得改

调整后的主要影响

基本信号 A/B/C

随信号变化

直接决定幅度、频率尺度、位移、宽度或占空比

可以观察不同参数怎样改变时域形状

FFT 的 Fs 与 N

12800 Hz、128 点

决定采样范围和频率分辨率

N 增大通常使频率采样更密,Fs 改变可观察频率范围

IIR 通阻带边缘

低通 4800/6000 Hz

直接定义需要保留和抑制的频段

过渡带越窄,满足相同衰减通常越困难

Gainpass / Gainstop

1 dB / 80 dB

控制滤波器允许的通带损失和阻带抑制度

指标越严格,所需阶数通常越高

IIR 响应类型

Lowpass

决定保留哪一段频率

可切换低通、高通、带通和带阻实验

需要注意,FFT 的 Fs、采样时间和 N 在程序中存在联动关系;修改其中一个以后,应检查另外两个是否仍然满足:

N = Fs × 采样时间

而不是把三个值彼此独立地随意填写。

17. 怎么运行这套程序?

把下面这些文件保持在同一个 MATLAB 工作目录或已经加入 MATLAB 路径:

DspToolbox.m/.fig、BasicSignal.m/.fig、Juanji.m/.fig

FFT.m/.fig、IIR.m/.fig、工程中的 WAV 文件

然后在 MATLAB 命令窗口运行:DspToolbox即可进入总菜单。

四个按钮分别进入四个独立模块。

基本信号和卷积模块可以直接选择参数后点击“确定”。

IIR 模块建议严格按照:

选择滤波器类型 → 填写/检查频率参数 → 填写 Gainpass/Gainstop → 点击“设计滤波器” → 再查看幅频、相频、冲激、阶跃或零极点图

的顺序操作。

18. 一句话看懂这个项目

这是一个数字信号处理实验工具:基本信号模块以 Fs=128 Hz、1024 个采样点绘制 sinc、正弦、矩形和方波;卷积模块用三组三角波、方波和阶跃离散序列比较线性卷积、11 点圆周卷积以及补零后的 FFT 卷积;FFT 模块默认用 Fs=12800 Hz、0.01 s、128 点衰减 chirp 观察时域、双边幅频和相频特性;IIR 模块则以当前 GUI 可见的 Butterworth 方法,根据通阻带边缘与衰减指标自动确定最小阶数,完成低通、高通、带通、带阻设计,并查看幅频、相频、冲激、阶跃和零极点响应。


来源:MATLAB学习与应用
MATLAB控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-10-10
最近编辑:1天前
explicit-z
硕士 工种号:MATLAB学习与应用
获赞 212粉丝 79文章 328课程 5
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈