
一句话介绍: 这套 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 已经没有完整暴露这些功能。
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等阶数估计函数自动计算最小阶数。
所以“固定阶数”目前更像保留下来的界面入口,而不是已完成的有效功能。
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
得到:对应连续绘制波形
输入:两组内置离散信号 + 卷积类型
得到:两个输入序列 + 卷积结果
输入:默认 chirp 或 WAV 音频片段 + 采样参数
得到:时域信号 + 双边幅度谱 + 相位谱 + 样本平方和
输入:滤波器类型 + 采样频率 + 通阻带边缘 + 通阻带衰减
得到: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 方法,根据通阻带边缘与衰减指标自动确定最小阶数,完成低通、高通、带通、带阻设计,并查看幅频、相频、冲激、阶跃和零极点响应。