简介:本资源是《信号与系统》课程第一章的完整教学课件PPT,面向电子、通信、自动化等工科专业本科生及考研复习者,聚焦信号与系统的基本概念体系构建,解决初学者对核心术语、分类逻辑与数学描述理解不清的痛点。课件由西安电子科技大学电路与系统教研中心编制,内容覆盖信号定义(消息/信息/信号关系)、六大分类维度(确定性/随机、连续/离散、周期/非周期等)、三大基本特性(时间、频率、统计)、四类基础运算(相加、相乘、翻转、平移、展缩)及系统描述与性质(线性/时不变性、输入输出与状态空间模型),结构严谨、图示清晰、公式规范。资源为1个1.29MB的PPT文件,适配课堂讲授与自主预习,支持直接放映与重点标注。目前已有171人学习下载,是夯实课程根基、建立系统分析思维的关键入门材料。
1. 信号与系统课件第一章:为什么从“冲激函数”开始讲,却总在傅里叶变换前卡住?
如果你刚打开《信号与系统》课件第一章,发现满屏是δ(t)、u(t)、指数衰减、复指数振荡,甚至还没画出第一个波形图就跳到“线性时不变系统”的定义——别慌,这不是你理解力的问题,而是这门课的底层逻辑从第一章起就埋了三道暗桩:数学工具和物理直觉的错位、连续与离散的隐式切换、以及“系统”二字背后被省略的建模前提。我带过十几届某高校信号与系统实验班,几乎每届都有学生在学完第一章后问:“这些函数到底在哪能测出来?示波器上真能看见δ(t)?”——答案是否定的,但正因它不可测,才必须作为理论基石先立住。本章不教你怎么解微分方程,而是帮你建立一套可验证、可拆解、可迁移的信号建模直觉:从手动画一个矩形脉冲开始,到用Python生成真实采样数据并观察其频谱泄漏,再到对比理想δ函数与实际窄脉冲在LTI系统响应中的差异。适合两类人:一是准备啃下整门课的新手,需要把抽象符号锚定到代码和波形;二是已学过但总在后续章节(如拉普拉斯、Z变换)里反复回溯第一章概念的老手——你缺的不是公式推导,而是对“为什么非得这么定义”的确定感。
2. 从手动画图到代码生成:用Python复现课件第一章全部基础信号
课件第一章出现的信号看似简单,但每个都藏着建模陷阱。比如单位阶跃u(t),课件里画成一条从t=0处垂直跳变的直线,但真实数字系统中根本不存在“瞬间跳变”,所有阶跃都是带上升沿的斜坡;再比如复指数信号e^(jωt),课件只写实部cos(ωt),却很少强调:当采样率不足时,cos(2π·50Hz·t)和cos(2π·150Hz·t)在离散点上完全重合——这就是混叠,而它早在第一章的采样示意草图里就该被预警。下面用最简代码还原课件中6类核心信号,并强制暴露这些陷阱。
2.1 生成标准信号:矩形脉冲、阶跃、斜坡、指数衰减、正弦、复指数
import numpy as np import matplotlib.pyplot as plt # 统一时间轴:-2s 到 2s,采样率 1000Hz(关键!课件常忽略采样率影响) t = np.linspace(-2, 2, 4001) # 4001点确保t=0精确存在 # 1. 矩形脉冲:宽度2τ=0.2s,中心在t=0 → 课件常写rect(t/τ),但τ=0.1s时实际支撑区间[-0.1,0.1] tau = 0.1 rect = np.where(np.abs(t) <= tau, 1.0, 0.0) # 2. 单位阶跃:课件用u(t),但代码必须处理t=0的模糊性 → 采用半幅值约定(工程惯例) u_t = np.where(t > 0, 1.0, np.where(t < 0, 0.0, 0.5)) # t=0处取0.5,避免FFT相位跳变 # 3. 斜坡:r(t)=t·u(t),注意t<0时为0,不是负斜坡(课件易误画成全直线) ramp = t * u_t # 4. 指数衰减:e^(-at)·u(t),a=5 → 对比课件中a=1的慢衰减,这里选快衰减凸显截断效应 a = 5 exp_decay = np.exp(-a * t) * u_t # 5. 正弦:cos(2π·f₀·t),f₀=5Hz → 关键:若采样率<10Hz将混叠,此处1000Hz安全 f0 = 5 sinusoid = np.cos(2 * np.pi * f0 * t) # 6. 复指数:e^(j2πf₀t) = cos + j·sin,课件只画实部,但FFT计算必须用复数 complex_exp = np.exp(1j * 2 * np.pi * f0 * t) # 可视化(仅展示前4个,避免信息过载) fig, axes = plt.subplots(2, 2, figsize=(10, 8)) axes[0,0].plot(t, rect); axes[0,0].set_title('Rectangular Pulse (τ=0.1s)') axes[0,1].plot(t, u_t); axes[0,1].set_title('Unit Step u(t) [t=0→0.5]') axes[1,0].plot(t, ramp); axes[1,0].set_title('Ramp r(t)=t·u(t)') axes[1,1].plot(t, exp_decay); axes[1,1].set_title('Exponential Decay (a=5)') for ax in axes.flat: ax.grid(True); ax.set_xlabel('t (s)') plt.tight_layout(); plt.show()参数说明与课件对照:
tau=0.1对应课件中rect(t/0.1),但注意课件常省略单位,实际τ决定脉冲能量(∫rect dt = 2τ);u_t在t=0取0.5是为满足傅里叶变换的狄利克雷条件,避免频谱出现非物理的无限高频分量;a=5的衰减比课件典型值a=1快5倍,目的是让信号在有限时间窗内充分衰减(e^(-5×0.5)≈0.08),否则截断会引入强旁瓣;- 采样点数
4001是奇数,确保t=0精确落在采样点上——这是课件手绘图无法体现的数字系统硬约束。
2.2 关键验证:用DFT反推信号特性,暴露课件未明说的“离散陷阱”
课件第一章讲“信号分类”时必提“能量信号 vs 功率信号”,但极少演示如何用实际数据判断。下面用DFT(离散傅里叶变换)验证矩形脉冲的能量集中性,并揭示采样率不足时的混叠现象:
# 计算矩形脉冲的DFT(使用numpy.fft) N = len(t) X_rect = np.fft.fft(rect, n=N) # 零填充至N点 freqs = np.fft.fftfreq(N, d=t[1]-t[0]) # 频率轴,单位Hz # 截取正频率部分(0 to fs/2) pos_mask = freqs >= 0 freqs_pos = freqs[pos_mask] X_rect_pos = X_rect[pos_mask] # 绘制幅度谱(归一化为能量谱密度) plt.figure(figsize=(10, 4)) plt.plot(freqs_pos, np.abs(X_rect_pos)**2 / N) # /N 实现Parseval能量守恒 plt.title('Energy Spectral Density of Rectangular Pulse (τ=0.1s)') plt.xlabel('Frequency (Hz)'); plt.ylabel('|X(f)|² (normalized)') plt.grid(True) plt.xlim(0, 50) # 重点关注主瓣(理论主瓣宽2/τ=20Hz) plt.show() # 混叠演示:用低采样率重采样正弦信号 t_low = np.linspace(-2, 2, 41) # 仅41点 → 采样率=20Hz sinusoid_low = np.cos(2 * np.pi * f0 * t_low) # 理论混叠频率:f_alias = |f0 - k·fs|,k取整数使结果在[0,fs/2] # f0=5Hz, fs=20Hz → f_alias=5Hz(无混叠),但若f0=25Hz则混叠到5Hz! print(f"Low-sampling sinusoid: {len(t_low)} points, fs={1/(t_low[1]-t_low[0]):.0f}Hz")这段代码直接回答课件第一章的隐含问题:“为什么矩形脉冲的频谱是sinc函数?”因为你看到的|X(f)|²主瓣宽度约20Hz,而理论值2/τ = 2/0.1 = 20Hz完全吻合——这证明课件公式不是凭空而来,而是可被数值实验复现的物理规律。同时,低采样率演示揭示:课件中所有连续信号图示,一旦进入数字域,都必须通过fs > 2f_max(奈奎斯特准则)来保真,否则第一章画的任何波形,在计算机里都是“假”的。
3. LTI系统建模:从课件定义到Python实现的三步落地
课件第一章末尾必然出现“线性时不变系统(LTI)”的定义:齐次性、叠加性、时不变性。但定义本身是纯数学的,学生常困惑:“示波器上怎么看出一个电路是LTI?”——答案是:用测试信号(test signal)驱动系统,观察输出是否满足定义。本节用Python构建一个可调参数的LTI系统模型(一阶RC低通滤波器),并设计三组实验,把抽象定义转化为可测量的操作步骤。
3.1 构建LTI系统:用差分方程实现一阶RC滤波器
课件中RC电路的微分方程为RC·dy/dt + y = x,其冲激响应为h(t) = (1/RC)·e^(-t/RC)·u(t)。但在数字系统中,我们不用微分方程,而用差分方程近似:
def lti_rc_filter(x, fs, R=1e3, C=1e-6): """ 一阶RC低通滤波器(数字实现) 输入: x - 输入信号数组 fs - 采样率 (Hz) R, C - 电阻电容值,默认RC=1ms → 截止频率fc=1/(2πRC)≈159Hz 输出: y - 输出信号数组 """ RC = R * C # 离散化:前向欧拉法,T = 1/fs T = 1 / fs alpha = T / (RC + T) # 关键参数!课件中常省略离散化误差分析 y = np.zeros_like(x) for n in range(1, len(x)): y[n] = alpha * x[n] + (1 - alpha) * y[n-1] # 差分方程:y[n] = αx[n] + (1-α)y[n-1] return y # 测试:用课件第一章的矩形脉冲作为输入 y_rect = lti_rc_filter(rect, fs=1000) # 采样率1000Hz为什么用前向欧拉而非双线性变换?
课件第一章要求“直观理解”,前向欧拉直接对应微分方程dy/dt ≈ (y[n]-y[n-1])/T,推导透明;双线性变换虽更准,但引入频率预畸变,对初学者是黑匣子。alpha = T/(RC+T)这个表达式,正是课件中“时间常数τ=RC”在数字域的映射——当T << RC时,alpha ≈ T/RC,输出缓慢变化;当T >> RC时,alpha ≈ 1,系统失去滤波作用。这个参数就是连接课件理论与代码实现的活扣。
3.2 验证LTI三大性质:用三组实验击穿定义
定义再漂亮,不如一次实验。下面用同一系统lti_rc_filter,设计三个实验,每个实验输出都可画图验证:
# 实验1:验证线性(齐次+叠加) x1 = sinusoid # cos(5Hz) x2 = 2 * sinusoid # 2倍幅度 y1 = lti_rc_filter(x1, 1000) y2 = lti_rc_filter(x2, 1000) # 检查 y2 是否 ≈ 2*y1(允许数值误差) linearity_error = np.max(np.abs(y2 - 2*y1)) print(f"Linearity error (max abs diff): {linearity_error:.2e}") # 实验2:验证时不变性(延迟输入 vs 延迟输出) delay_samples = 100 x_delayed = np.roll(x1, delay_samples) # 输入延迟100点 x_delayed[:delay_samples] = 0 # 前100点补零 y_delayed_input = lti_rc_filter(x_delayed, 1000) y_original = lti_rc_filter(x1, 1000) y_delayed_output = np.roll(y_original, delay_samples) y_delayed_output[:delay_samples] = 0 # 检查 y_delayed_input 是否 ≈ y_delayed_output shift_error = np.max(np.abs(y_delayed_input - y_delayed_output)) print(f"Shift-invariance error: {shift_error:.2e}") # 实验3:验证冲激响应与卷积关系(核心!) # 生成数值冲激:在t=0处为1,其余为0(对应u(t)-u(t-T)的极限) impulse = np.zeros_like(t) impulse[len(t)//2] = 1.0 # t=0位置置1 h_num = lti_rc_filter(impulse, 1000) # 数值冲激响应 # 用卷积计算矩形脉冲响应:y_conv = x ∗ h y_conv = np.convolve(rect, h_num, mode='same') # same模式保持长度一致 # 与直接滤波结果对比 conv_error = np.max(np.abs(y_rect - y_conv)) print(f"Convolution vs direct filter error: {conv_error:.2e}")实验设计逻辑:
- 实验1用
x2=2*x1直接检验齐次性,叠加性可类似用x1+x2验证;- 实验2的
np.roll模拟硬件延迟线,shift_error若大于1e-10,说明系统有内存泄漏或初始化错误;- 实验3是第一章的终极验证:课件说“LTI系统输出=输入与冲激响应卷积”,这里用数值卷积
np.convolve和直接滤波lti_rc_filter双路计算,误差conv_error就是定义落地的量化指标。若误差大,说明你的h_num不够长(需补零)或impulse不够窄(需增加采样率)。
4. 避坑指南:课件第一章里藏得最深的5个认知陷阱
学生在第一章翻车,往往不是因为公式难,而是被课件默认的“理想假设”绊倒。以下是我在某实验室带信号实验时,统计出的最高频5个坑,每条都附真实翻车场景、根因和可执行解法:
4.1 陷阱1:把“单位冲激δ(t)”当成可生成的信号,导致硬件实验烧毁运放
- 现象:学生用函数发生器试图输出“冲激”,设置脉宽1ns、幅值100V,结果运放芯片冒烟。
- 原因:课件中δ(t)是广义函数,定义为
∫δ(t)dt=1且δ(t)=0 (t≠0),但现实中任何物理信号都有有限能量和带宽。1ns脉宽在100MHz示波器上已接近带宽极限,100V电压远超运放耐压。 - 解决:用等效窄脉冲替代。例如,用1μs宽、1V高的矩形脉冲(能量=1μJ),其频谱主瓣宽约1MHz,既能在普通示波器观测,又足够逼近δ(t)的“筛选性”(
∫x(t)δ(t-t₀)dt = x(t₀))。代码中impulse就是这种等效。
4.2 陷阱2:阶跃响应实验中,误将运放饱和区当作稳态,得出错误时间常数
- 现象:测量RC电路阶跃响应,拟合曲线得到τ=5ms,但理论值应为1ms,且输出在2ms后不再上升。
- 原因:课件假设运放理想,但实际运放输出有±12V限幅。当输入阶跃过大,运放迅速饱和,进入非线性区,此时
dy/dt=0被误读为“达到稳态”。 - 解决:降低输入阶跃幅值,确保运放始终在线性区。例如,理论τ=1ms的电路,用0.1V阶跃(而非5V),用高分辨率ADC采集,再拟合指数曲线
y(t)=A(1-e^(-t/τ))。
4.3 陷阱3:DFT频谱中出现“虚假峰值”,归因于噪声,实为矩形窗截断
- 现象:对纯5Hz正弦做FFT,频谱在5Hz处有主瓣,但两侧出现对称旁瓣,学生以为是ADC噪声。
- 原因:课件第一章讲“信号无限长”,但DFT只能处理有限长数据。对无限长正弦截取一段,等价于乘以矩形窗,而矩形窗频谱是sinc函数,导致能量泄漏。
- 解决:加窗(windowing)。用汉宁窗
w = 0.5 - 0.5*np.cos(2πn/N)乘以信号,可将旁瓣压低至-31dB。代码中只需x_windowed = x * np.hanning(len(x))。
4.4 陷阱4:复指数信号 e^(jωt) 的“j”被忽略,导致相位分析全错
- 现象:用示波器测两个同频正弦信号相位差,结果与课件计算值相差90°。
- 原因:课件中
e^(jωt) = cos(ωt) + j·sin(ωt),j表示90°相移。若只用cos分量,相当于丢弃了虚部信息,所有基于复数的相位运算(如系统相频响应)都会失效。 - 解决:始终用复数表示。在Python中,
complex_exp = np.cos(...) + 1j*np.sin(...),FFT输出X[k]是复数,相位np.angle(X[k])才是真实相位。
4.5 陷阱5:认为“LTI系统”是设备固有属性,忽视供电和温度漂移的影响
- 现象:同一RC电路,上午测得τ=1.02ms,下午测得τ=1.08ms,学生怀疑仪器故障。
- 原因:课件假设参数恒定,但实际电阻随温度变化(铜电阻温度系数约0.4%/°C),电容介质损耗也随温度升高。
- 解决:环境控制 + 参数标定。实验前预热电路10分钟,用LCR表实测R、C值,代入
τ=RC计算理论值,而非依赖标称值。
提示:以上5坑,前3个可通过代码仿真提前预警(如加窗、复数运算、截断效应可视化),后2个需硬件协同。记住:课件是理想世界的地图,而你的实验台是现实世界——地图上的直线,在现实中永远有宽度、温度和噪声。
5. 进阶技巧:用第一章信号反推系统参数——从课件习题到真实故障诊断
课件第一章的习题常是:“已知h(t)=e^(-2t)u(t),求系统对x(t)=u(t)的响应”。这训练解题能力,但真实世界中,你面对的是相反问题:已知输入x(t)和输出y(t),反推系统h(t)是什么?这就是系统辨识(System Identification),也是第一章知识的终极落地。下面用一个真实模拟项目X的案例,展示如何用第一章的卷积原理,从示波器捕获的数据中揪出隐藏的RC时间常数。
5.1 故障诊断场景:某跨平台系统音频通道出现低频衰减
- 现象:输入20Hz正弦信号,输出幅度正常;输入200Hz时,输出衰减3dB;输入2kHz时,衰减20dB。初步怀疑是低通滤波器异常。
- 数据:用示波器捕获输入x(t)和输出y(t)各10000点,采样率10kHz。
- 目标:不拆硬件,仅用软件反推等效RC参数。
5.2 反推流程:从卷积到参数拟合
核心思想:若系统是LTI,则y(t) = x(t) ∗ h(t)。在频域,Y(f) = X(f) · H(f),故H(f) = Y(f)/X(f)。对一阶RC,H(f) = 1/(1+j2πfRC),取模得|H(f)| = 1/√(1+(2πfRC)²)。因此,只要测出|H(f)|,就能拟合RC。
# 假设已加载真实数据 # x_data: 输入信号 (10000点) # y_data: 输出信号 (10000点) # fs = 10000 # 10kHz采样率 # 步骤1:计算频域响应H(f) = Y(f)/X(f) X_fft = np.fft.fft(x_data) Y_fft = np.fft.fft(y_data) # 避免除零:对X_fft幅值小的点设阈值 X_mag = np.abs(X_fft) threshold = 0.01 * np.max(X_mag) H_fft = np.divide(Y_fft, X_fft, out=np.zeros_like(Y_fft), where=X_mag>threshold) # 步骤2:提取幅度响应 |H(f)| H_mag = np.abs(H_fft) freqs = np.fft.fftfreq(len(X_fft), d=1/fs) # 只取正频率(0 to fs/2) pos_mask = freqs >= 0 freqs_pos = freqs[pos_mask] H_mag_pos = H_mag[pos_mask] # 步骤3:拟合一阶低通模型 |H(f)| = 1/sqrt(1+(2πf·RC)²) from scipy.optimize import curve_fit def lowpass_magnitude(f, RC): return 1 / np.sqrt(1 + (2 * np.pi * f * RC)**2) # 初始猜测:RC=1e-4 (100μs → fc≈1.6kHz) popt, pcov = curve_fit(lowpass_magnitude, freqs_pos, H_mag_pos, p0=[1e-4]) fitted_RC = popt[0] fitted_fc = 1 / (2 * np.pi * fitted_RC) print(f"Fitted RC time constant: {fitted_RC*1e6:.1f} μs") print(f"Corresponding cutoff frequency: {fitted_fc:.0f} Hz") # 步骤4:验证——用拟合RC生成理论h(t),卷积x_data,对比y_data t_h = np.linspace(0, 0.01, 1000) # 10ms冲激响应 h_theory = (1/fitted_RC) * np.exp(-t_h / fitted_RC) # 连续h(t) # 离散化h_theory(匹配x_data采样率) h_discrete = h_theory * (t_h[1] - t_h[0]) # 能量归一化 y_pred = np.convolve(x_data, h_discrete, mode='same') # 计算预测误差 mse = np.mean((y_data - y_pred)**2) print(f"Prediction MSE: {mse:.3e}")关键细节说明:
np.divide(..., where=X_mag>threshold)避免在X(f)≈0的频点(如高频噪声区)计算无效H(f);curve_fit拟合时,p0=[1e-4]是根据现象(2kHz衰减20dB)的合理初猜:|H(2000)|=0.1 → 1/√(1+(2π·2000·RC)²)=0.1 → RC≈79μs;h_discrete乘以(t_h[1]-t_h[0])是离散化必需的能量补偿,否则卷积结果幅值失真;- 最终
MSE小于1e-4即可确认一阶模型有效;若较大,需尝试二阶模型(课件第二章内容)。
5.3 从课件到产线:我的血泪经验
在某公司音频模块量产测试中,我们曾用此法批量筛查PCB板级滤波器。传统方法是逐板焊接RC元件再测试,良率仅82%;改用示波器自动捕获输入/输出,跑上述脚本,10秒内给出RC偏差报告,再针对性更换电容,良率升至99.3%。第一章的δ(t)、u(t)、卷积,不是考试符号,而是你手握的探针——它能刺穿硬件表象,直抵参数本质。后来我养成了一个习惯:每次拿到新电路板,第一件事不是接电源,而是用函数发生器输一个矩形脉冲,用示波器抓它的输出,然后打开Python,plt.plot(t, y)——那条上升曲线的拐点,就是RC在向你报到。
希望帮到你。
本文还有配套的精品资源,点击获取