ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

信号分析与处理实验全链路:从采样到滤波器设计的MATLAB实现

信号分析与处理实验全链路:从采样到滤波器设计的MATLAB实现 简介这份资源是南京邮电大学「信号分析与处理实验」课程的完整实验报告面向正在修读数字信号处理、信号与系统相关课程的高校学生以及需要借助 MATLAB 完成实验与课程设计的自学者。报告覆盖信号的产生和运算、连续时间信号的频域分析、信号的时域采样和重建、离散傅里叶变换与应用等核心实验并延伸至连续时间系统的频域与复频域分析、数字滤波器设计及信号处理综合应用。压缩包内为 1 个 docx 文档约 1.02MB按实验逐项整理实验目的、内容、程序代码与结果分析配有大量 MATLAB 绘图与数据解析便于对照理解信号的时域和频域特性。目前已有 951 人学习下载适合作为实验预习、报告撰写与 DSP 入门练习的参考帮助读者掌握 MATLAB 编程、波形绘制、卷积运算、采样重建及 DFT 实现等关键操作为后续深入研究数字信号处理打下基础。1. 信号分析与处理实验的四个台阶从采样到滤波器设计很多同学拿到“信号分析与处理实验报告实验1-4”这个任务时第一反应是打开 MATLAB 敲几行plot把图截下来交差。但真正拉开差距的地方在于实验一到实验四其实是一条完整的信号处理链路——离散化、频谱观察、系统响应、滤波器落地。前一个实验的输出往往是后一个实验的输入如果实验一采样率设错实验三的卷积结果就会失真实验四设计的滤波器也验证不出正确效果。这套实验通常面向电子信息、通信工程专业的本科生配套教材多为《数字信号处理》或《信号与系统》。它要解决的核心问题是把课本上连续的傅里叶变换、Z 变换、差分方程变成能在计算机上跑出来、能画出来、能验证的离散数据。适合正在赶实验报告的低年级同学也适合想重新梳理 DSP 基础链路的从业者。下面按实验一到实验四的顺序把每个实验的原理、代码、参数和坑讲清楚。2. 实验一与实验二信号采样、频谱分析与常见误读2.1 实验一的核心离散化与采样定理的代码验证实验一通常要求生成一个连续信号正弦、方波或指数衰减按不同采样频率离散化观察频谱混叠。原理上就是采样定理采样频率必须大于信号最高频率的两倍。但代码里真正容易出错的是时间轴的定义方式。% 实验一正弦信号采样与频谱观察 fs 1000; % 采样频率 1000 Hz T 1; % 观察时长 1 秒 t 0:1/fs:T-1/fs; % 离散时间轴注意不要写成 0:1/fs:T f0 50; % 信号频率 50 Hz x sin(2*pi*f0*t); % 离散正弦序列 N length(x); % 采样点数 X fft(x); % 快速傅里叶变换 f (0:N-1)*(fs/N); % 频率轴 mag abs(X)/N*2; % 幅度归一化除以 N 再乘 2 subplot(2,1,1); plot(t, x); title(时域波形); subplot(2,1,2); plot(f(1:N/2), mag(1:N/2)); title(单边幅度谱);逻辑说明t 0:1/fs:T-1/fs保证点数正好是fs*T如果写成0:1/fs:T会多一个点导致fft的频率分辨率出现细微偏差。mag abs(X)/N*2是单边谱的标准归一化除以 N 是因为 FFT 不做归一化乘 2 是因为单边谱把负频率的能量折过来了。参数说明fs决定频率轴的上限只能观察到fs/2以内的频率这就是奈奎斯特频率。f0如果超过fs/2频谱上会出现一个“假频率”这就是混叠。把fs改成 80f0保持 50你会看到 50 Hz 的信号跑到 30 Hz 的位置上这就是实验报告里最该写的一段分析。提示实验报告里不要只贴图要写清楚“当 fs80Hz 时50Hz 信号混叠到 30Hz验证了 fs 必须大于 2f0”。2.2 实验二频谱分析的三个必调参数实验二一般要求对多频率成分信号做频谱分析观察频率分辨率、泄漏和窗函数的影响。这里三个参数必须调对采样点数N、窗函数类型、FFT 点数。参数作用常见取值调错后果N采样点数决定频率分辨率 Δffs/N1024、2048N 太小两个靠近的频率分不开窗函数抑制频谱泄漏矩形窗、汉宁窗、汉明窗不加工旁瓣泄漏淹没小信号FFT 点数决定频谱的插值密度取 N 或 2N补零只加密曲线不提高真实分辨率% 实验二加窗与频谱泄漏对比 fs 1000; N 256; t (0:N-1)/fs; x 0.5*sin(2*pi*100*t) 0.3*sin(2*pi*105*t); % 两个靠近的频率 w_rect rectwin(N); % 矩形窗 w_hann hann(N); % 汉宁窗 X_rect fft(x.*w_rect, 1024); % 补零到 1024 点 X_hann fft(x.*w_hann, 1024); f (0:1023)*(fs/1024); plot(f(1:512), 20*log10(abs(X_rect(1:512))), b); hold on; plot(f(1:512), 20*log10(abs(X_hann(1:512))), r); legend(矩形窗,汉宁窗); xlabel(频率/Hz); ylabel(幅度/dB);逻辑说明两个频率 100 Hz 和 105 Hz 间隔 5 Hz而 Δffs/N1000/256≈3.9 Hz理论上刚好能分开但矩形窗旁瓣高小信号容易被泄漏掩盖。加汉宁窗后主瓣变宽但旁瓣低频谱更干净。fft(..., 1024)是补零到 1024 点让曲线更平滑但真实分辨率仍由 N256 决定。参数说明20*log10(abs(...))是把幅度转成 dB方便观察旁瓣。如果实验报告要求测“最小可分辨频率间隔”就把 N 从 256 逐步加到 1024记录能分开 100 Hz 和 105 Hz 的最小 N。注意补零不会提高频率分辨率这是实验报告里高频扣分点。分辨率只由实际采样时长 TN/fs 决定。3. 实验三离散系统响应与卷积的工程实现3.1 从差分方程到系统函数先建模再仿真实验三通常给一个线性时不变系统的差分方程比如 y[n] 0.8y[n-1] x[n]要求求单位脉冲响应、阶跃响应和频率响应。原理上差分方程做 Z 变换得到系统函数 H(z)分母的根就是极点极点位置决定稳定性。% 实验三差分方程 y[n] 0.8y[n-1] x[n] b [1]; % 分子系数对应 x[n] a [1, -0.8]; % 分母系数对应 y[n] - 0.8y[n-1] % 单位脉冲响应 n 0:30; h impz(b, a, n); % 阶跃响应 step_resp filter(b, a, ones(1, 31)); % 频率响应 [H, w] freqz(b, a, 512); subplot(3,1,1); stem(n, h); title(单位脉冲响应 h[n]); subplot(3,1,2); stem(n, step_resp); title(阶跃响应); subplot(3,1,3); plot(w/pi, abs(H)); title(幅频响应);逻辑说明a [1, -0.8]对应 y[n] - 0.8y[n-1]MATLAB 的filter和impz都要求分母写成这种形式符号写反会导致系统发散。impz直接算脉冲响应filter用递推方式算任意输入的响应。freqz在单位圆上采样 512 点得到数字频率响应。参数说明极点位置在 z0.8模小于 1系统稳定。如果把a改成[1, -1.2]极点跑到 1.2脉冲响应会指数增长stem图会直接冲出去这就是实验报告里验证稳定性最直观的方式。3.2 卷积的两种算法conv 与 filter 的差别实验三常要求验证卷积定理时域卷积等于频域相乘。这里要区分conv和filter。% 卷积验证时域卷积 vs 频域相乘 x [1, 2, 3, 4]; h [1, 0.5, 0.25]; y_time conv(x, h); % 时域直接卷积 N length(x) length(h) - 1; % 卷积后长度 X fft(x, N); H fft(h, N); y_freq ifft(X .* H); % 频域相乘再反变换 disp(y_time); disp(real(y_freq)); % 取实部消除浮点误差逻辑说明conv输出长度是length(x)length(h)-1所以 FFT 必须补零到这个长度否则频域相乘对应的是循环卷积结果会混叠。ifft结果可能有极小虚部用real取实部。参数说明如果实验要求“用 filter 实现卷积”需要把 h 作为分子系数、a1即filter(h, 1, x)结果和conv一致。区别在于filter适合实时流式处理conv适合离线批处理。提示实验报告里写“循环卷积与线性卷积的区别”时用补零前后的ifft结果对比比纯文字描述有说服力。4. 实验四滤波器设计与验证的完整流程4.1 IIR 与 FIR 的选型理由实验四一般要求设计一个低通或带通滤波器滤掉指定频率成分。选 IIR 还是 FIR是实验报告里必须交代的。IIR 阶数低、计算量小但相位非线性FIR 可以做到严格线性相位但阶数高。常见做法是对相位敏感如音频、通信用 FIR对计算资源敏感用 IIR。% 实验四FIR 低通滤波器设计窗函数法 fs 8000; % 采样频率 fc 1000; % 截止频率 N 64; % 滤波器阶数 wc fc/(fs/2); % 归一化截止频率 h_fir fir1(N, wc, low, hamming(N1)); % 验证幅频响应 [H, f] freqz(h_fir, 1, 1024, fs); plot(f, 20*log10(abs(H))); xlabel(频率/Hz); ylabel(幅度/dB); grid on;逻辑说明fir1的截止频率要归一化到奈奎斯特频率即fc/(fs/2)。hamming(N1)是窗函数长度必须和滤波器系数个数一致写错会报维度错误。freqz(h_fir, 1, 1024, fs)最后一个参数直接给出频率轴单位 Hz。参数说明N64决定过渡带宽度N 越大过渡带越窄但计算量越大。如果阻带衰减不够换kaiser窗并调 beta 参数。IIR 版本可以用butter、cheby1但要注意butter返回的b,a要直接传给filter。4.2 滤波效果的时域与频域双重验证设计完滤波器必须用含噪信号验证。只看幅频响应曲线不够要看滤波前后的时域波形和频谱。% 生成含噪信号并滤波 t 0:1/fs:0.1; x sin(2*pi*300*t) 0.5*sin(2*pi*3000*t); % 300Hz 有用3000Hz 干扰 y filter(h_fir, 1, x); % FIR 滤波 % 对比频谱 X abs(fft(x)); Y abs(fft(y)); f_axis (0:length(x)-1)*(fs/length(x)); subplot(2,1,1); plot(f_axis(1:end/2), X(1:end/2)); title(滤波前); subplot(2,1,2); plot(f_axis(1:end/2), Y(1:end/2)); title(滤波后);逻辑说明3000 Hz 的干扰在截止频率 1000 Hz 之外滤波后应该被大幅衰减。filter(h_fir, 1, x)中 a1 表示 FIR 只有前馈。对比两张频谱图3000 Hz 处的峰值应该明显下降。参数说明如果滤波后 300 Hz 幅度也掉了说明截止频率设低了或阶数不够导致过渡带太宽。如果 3000 Hz 没压下去检查wc是否算错或者滤波器阶数是否太低。注意filter会引入群延迟FIR 线性相位滤波器的延迟是 N/2 个采样点。实验报告里如果要求对齐波形需要把输出前移 N/2 点。5. 实验报告里的进阶技巧从能跑到能讲清楚5.1 用脚本一键复现四个实验四个实验分开写脚本最后交报告时容易漏图。常见做法是写一个主脚本用saveas批量导出图片保证每次运行结果一致。% run_all_experiments.m clear; close all; fig1 figure; experiment1(); saveas(fig1, exp1.png); fig2 figure; experiment2(); saveas(fig2, exp2.png); fig3 figure; experiment3(); saveas(fig3, exp3.png); fig4 figure; experiment4(); saveas(fig4, exp4.png); disp(四张实验图已导出);逻辑说明每个实验封装成函数内部用subplot画多张子图saveas按固定文件名导出避免手动截图。clear和close all保证环境干净防止上一个实验的变量污染下一个。参数说明saveas支持png、fig、pdf交报告建议用 png 保证清晰度。如果实验要求对比不同参数可以在函数里加循环把多组结果画在同一张图上。5.2 参数扫描与结果记录表实验报告里最有信息量的部分是参数变化对结果的影响。与其只交一组默认参数不如做一次扫描。实验扫描参数观察指标记录方式实验一fs 从 80 到 1000混叠频率位置频谱峰值对应频率实验二N 从 128 到 1024最小可分辨间隔两峰是否分开实验三极点从 0.8 到 1.2脉冲响应收敛性响应是否发散实验四阶数 N 从 16 到 128阻带衰减 dB3000Hz 处衰减量把这张表填满实验报告的分析部分就有数据支撑而不是空谈“效果良好”。扫描代码可以用for循环包住核心计算每次把关键指标存进数组最后用table或fprintf输出。5.3 常见报错与排查顺序跑这四个实验报错集中在几类维度不匹配、频率轴算错、滤波器系数符号写反。排查顺序建议是先看size是否一致再检查归一化频率是否超过 1最后确认差分方程系数符号。freqz报错多半是a的第一个元素不是 1filter报错多半是b和a长度关系搞混。把这些排查点写进实验报告的“问题与解决”部分比只写“运行成功”更有价值。本文还有配套的精品资源点击获取
返回列表