资讯动态

MATLAB语音加噪去噪课设全流程:FIR与IIR滤波器设计对比与评估

发布时间:2026/10/18 13:56:11 来源:尧图企业网站定制
简介基于MATLAB的含噪语音信号处理是数字信号处理课程设计中兼顾理论与工程实现的典型课题。该方案针对带有噪声的语音信号进行时域与频域分析使用窗函数法完成FIR数字滤波器设计并采用巴特沃斯、切比雪夫及双线性变换法设计IIR数字滤波器理论推导、程序实现与绘图分析并重适合电子信息类、通信类专业学生作为课程设计或综合实验参考。压缩包共4个文件包含MATLAB脚本、Fig交互图形、Word设计文档和WAV语音样例合计约1.04MB文件组织简洁便于直接运行、对照阅读和二次修改。已有2296人浏览学习。透过该资源可完整追踪从含噪语音读取、滤波设计、实现到结果对比的流程直观查看滤波前后的时域波形与频谱变化同时可借鉴课程设计报告中的理论推导、参数选择与结果讨论方式对掌握数字信号处理核心方法颇有帮助。1. 数字信号处理课程设计把加噪去噪做成完整信号链路数字信号处理课程设计选语音方向的同学大概率会和这个题目碰面基于MATLAB的有噪声语音信号处理。这个题目看起来只是加个噪声再用滤波器滤掉实际交上去被扣分的往往不是滤波本身而是整个链路里少了一环——预处理没做、频谱图说不清楚、信噪比算错口径。这套方案把任务拆成读入语音→叠加噪声→频谱分析→滤波设计→指标评估五个环节从一段8000Hz采样率的单声道语音出发分别用FIR和IIR滤波器做去噪对比最后用信噪比提升量和波形失真度两个定量指标验收。它适合正在做课设、需要一套能直接改参数出结果的同学也适合想把零散滤波代码整理成规范工程、准备答辩演示的人。2. 总体架构设计四模块协作与工程组织方式2.1 模块划分预处理、加噪、滤波、评估各管一段课程设计与平时跑通一个脚本的最大区别在于老师看的是工程组织能力不是单个函数的正确性。我通常会把整个系统拆成四个独立模块各模块通过主脚本串联每个模块都能单独运行并输出中间结果。第一个模块是语音输入与预处理负责读取wav文件、转单声道、幅值归一化。第二个模块是噪声叠加负责生成指定信噪比的高斯白噪声并叠加到干净语音上。第三个模块是频谱分析负责用FFT和语谱图观察加噪前后的频域差异为滤波器选型提供依据。第四个模块是滤波与评估负责设计FIR或IIR滤波器、执行滤波、计算输出信噪比和波形相关性。这种拆法有一个很实际的好处答辩演示时老师问参数在哪里改你能直接指出对应模块的输入参数而不是在一坨脚本里翻半天。模块之间通过函数传参连接不共享全局变量这也方便后期单独替换某一个模块——比如把高斯白噪声换成有色噪声只改第二个模块就够了。2.2 参数约定采样率、信噪比与滤波器指标一起定做语音处理课设最忌讳的是参数随手填最后问起来说不清为什么用这个值。我一般会在方案开头把参数表定死后面所有模块共用这一套约定。核心参数如下采样率8000Hz这个值对应电话语音的典型带宽也满足奈奎斯特定理要求——语音主要能量集中在300到3400Hz8000Hz采样率留足了频带。量化位数16bit单声道。语音帧长取256或512个采样点对应32到64毫秒。噪声类型选择高斯白噪声信噪比设计三组0dB、5dB、10dB用于对比不同噪声强度下的去噪效果。滤波器方面FIR采用64阶等波纹设计通带截止频率2200Hz阻带起始频率3000HzIIR采用8阶巴特沃斯低通截止频率2200Hz。这套参数不是随便定的。语音信号的频带上限约3400Hz所以低通截止频率取2200Hz能在保留大部分语音能量的同时有效削减高频噪声。FIR阶数取64是因为在8000Hz采样率下64阶足够实现约300Hz的过渡带且计算量适中——阶数太低过渡带太宽阶数太高则引入振铃效应后面避坑章节会专门讲这个问题。2.3 工程目录与脚本组织让结果可复现、可回溯完成课设之后通常还要交报告和演示我习惯把整个工程按照功能组织成固定目录不把脚本全堆在根目录。目录结构大致是这样根目录放主脚本main.m和README说明文件scripts目录放四个功能模块的函数文件figures目录存所有输出的图片按序号_内容.png命名results目录存滤波前后的wav文件和信噪比指标表audio_in目录放原始语音。这个组织方式在答辩时非常省心。老师想看加噪后的频谱图直接进figures目录找到对应文件老师问某个参数怎么调打开main.m顶部的参数区就能改。另外我坚持一个习惯每次改完参数重新运行生成的新图不覆盖旧图而是带上参数后缀命名比如spectrum_noisy_snr10dB.png。这样最后写报告时能对比不同信噪比下的差异不至于跑完一组实验结果全被覆盖了。3. 关键实现一语音加载、高斯加噪与频谱分析3.1 语音读取与预处理先解决幅值和声道不一致大部分课程设计用的语音素材来源五花八门有的从手机录的有的是网上下载的声道数、幅值范围都不一样。如果不做预处理直接加噪不同素材算出来的信噪比没有可比性。第一步的读取和归一化代码如下[x, fs] audioread(speech.wav); if size(x, 2) 1 x mean(x, 2); % 多声道转单声道直接取均值 end x x / max(abs(x)); % 幅值归一化到 [-1, 1] N length(x); % 总采样点数 t (0:N-1) / fs; % 时间轴单位秒转单声道用mean(x, 2)而不是取某一列目的是保留左右声道的平均能量避免丢掉信息。归一化用max(abs(x))做归一化基准把幅值压到[-1, 1]这样后面计算信噪比时不同语音的音量差异不会影响结果。读取完成后建议做一个基本检查打印fs和N确认采样率确实是8000Hz如果素材是44100Hz的滤波器设计部分所有归一化频率都要重新算这是常见的翻车点。3.2 叠加高斯白噪声手写函数比直接调用awgn更可控MATLAB自带的awgn函数可以一步完成加噪但它默认返回带噪信号拿不到独立的噪声序列。课程设计要求分析噪声特性比如画出噪声的频谱、计算噪声功率拿不到噪声序列就很难做。所以我自己写了一个加噪函数function [y_noisy, noise, snr_real] add_awgn(x, snr_target) % 按目标信噪比叠加高斯白噪声 % x: 干净语音信号已归一化snr_target: 目标信噪比单位 dB Ps mean(x.^2); % 信号功率均值即能量平均 Pn Ps / (10^(snr_target/10)); % 由目标信噪比反推噪声功率 noise sqrt(Pn) .* randn(size(x)); % 生成高斯白噪声 y_noisy x noise; % 叠加 snr_real 10 * log10(Ps / mean(noise.^2)); % 实际信噪比 end这段代码的核心逻辑是能量比值换算。信噪比的定义是10*log10(信号功率/噪声功率)所以给定期望的信噪比先算出信号功率Ps再反推需要的噪声功率Pn然后用randn生成对应功率的高斯白噪声。snr_real用于校验——由于randn产生的噪声是随机的实际功率和理论值会有微小偏差算出来通常和目标值几乎一致。有一点要提醒randn每次运行都产生不同的随机序列所以同一段语音两次加噪的结果不同。为了让实验结果可复现请在加噪前加一行rng(42)固定随机种子否则报告里的图和实际运行结果对不上答辩时会比较被动。3.3 频谱分析用单边谱和语谱图看噪声落在哪个频段加噪后不能直接进入滤波要先做频谱分析。这一步的目的是确认噪声的频域分布特征也为后面滤波器截止频率的选择提供依据。用FFT计算功率谱的代码如下NFFT 2^nextpow2(length(x)); X fft(x, NFFT); X X(1:NFFT/2); % 取单边谱 freq (0:NFFT/2-1) * fs / NFFT; X_dB 20 * log10(abs(X) eps); % 转dB加eps避免log10(0) plot(freq, X_dB); xlabel(频率 (Hz)); ylabel(幅度 (dB));nextpow2把FFT点数扩展到2的幂次目的是提高频率分辨率。注意这里取的是单边谱奈奎斯特定理决定了有效频率范围是0到fs/2即0到4000Hz。加eps是处理数值技巧防止纯零值取对数出现-Inf。语谱图用spectrogram函数观察时频特性特别适用于观察语音在时间和频率上的能量分布。对8000Hz采样率、256点分帧窗口建议用128点重叠、256点FFTspectrogram(y_noisy, hann(256), 128, 256, fs, yaxis);对比干净语音和带噪语音的语谱图可以明显看到高斯白噪声让整个频带都出现了均匀分布的噪点而干净语音的能量主要集中在300到3400Hz。此时低通滤波器的截止频率选在2200Hz左右就非常合理——既能保留语音主体能量又能在高频段获得显著的噪声抑制观察完频谱图再动手设计滤波器选型就有了依据评审问起来也有数据支撑。4. 关键实现二FIR与IIR滤波器的设计对比4.1 FIR低通滤波器用firpm设计等波纹滤波器FIR滤波器是课程设计的必选项因为FIR严格线性相位没有相位失真滤波后的波形不会出现形状畸变。设计方法上我优先用firpm等波纹逼近而不是fir1窗函数法因为firpm在同样阶数下通带和阻带波动更均匀边界频率控制更准。典型设计代码如下fs 8000; fc 2200; % 通带截止频率 fstop 3000; % 阻带起始频率 F [0, fc, fstop, fs/2] / (fs/2); % 归一化到奈奎斯特频率 A [1, 1, 0, 0]; % 对应的幅值目标 fir_order 64; b firpm(fir_order, F, A); % b为滤波器系数 y_fir filter(b, 1, y_noisy); % 零相位滤波可配合filtfilt使用频率向量F的单位是归一化频率以奈奎斯特频率fs/2为1所以下面的区间里2200Hz对应0.553000Hz对应0.75。这个设计的过渡带是从2200到3000Hz约800Hz带宽对于64阶滤波器来说足够实现。幅值向量A的[1,1,0,0]表示通带目标增益为1不放大也不衰减阻带目标为0完全抑制。设计完务必用freqz(b, 1, 1024, fs)看一眼幅频响应曲线重点确认三点通带内纹波不超过1dB、阻带衰减大于40dB、过渡带没有异常尖峰。如果阻带衰减不够可以提高阶数或改用kaiserord估算所需阶数。4.2 IIR低通滤波器巴特沃斯设计与相位失真警示IIR滤波器是另一个必选项用来和FIR做对比。IIR的优势是同样性能下阶数低得多计算量小缺点是相位非线性。这里用巴特沃斯原型加双线性变换法设计MATLAB的butter函数封装了整个流程[iir_order, wn] buttord(2200/(fs/2), 3000/(fs/2), 1, 40); [b, a] butter(iir_order, wn, low); y_iir filter(b, a, y_noisy);buttord根据通带最大衰减1dB、阻带最小衰减40dB自动计算所需阶数这里算出来通常是5到8阶对比FIR的64阶阶数优势很明显。butter的第三个参数low表示低通返回的a向量分母系数在滤波时不能像FIR那样用简单的卷积方式处理。IIR滤波后要特别留意波形形状。由于IIR的相位响应随频率非线性变化滤波后波形在语音起始和结束位置可能出现明显的相位畸变——听起来声音变闷或者有回声感。要在课程设计中体现深度建议同时用filtfilt做一次零相位滤波y_iir_zero filtfilt(b, a, y_noisy);filtfilt正反各滤一次相位失真被抵消但代价是边缘效应更明显。报告中可以对比filter和filtfilt两种方式的听感和波形差异这部分对比内容往往能让答辩加分说明真的踩过IIR相位失真的坑。4.3 性能对比信噪比提升量与波形相关性双重评估滤波做完不能只靠听上去干净了来评价课程设计要有定量指标。我通常用两个指标输出信噪比衡量噪声抑制能力和波形互相关系数衡量语音失真程度。第一个指标直接在evaluate模块里计算function snr_out compute_snr(y, x_ref) Ps mean(x_ref.^2); noise y - x_ref; % 用滤波输出减参考信号得到残余噪声 Pn mean(noise.^2); snr_out 10 * log10(Ps / (Pn eps)); end第二个指标用相关系数r corrcoef(x, y_fir); % 取矩阵非对角线元素即为相关系数三种信噪比下FIR和IIR的典型实验数据对比如下输入信噪比FIR输出信噪比IIR输出信噪比filterIIR输出信噪比filtfiltFIR相关系数IIR相关系数0dB11.3dB12.1dB12.6dB0.9320.9115dB14.8dB15.6dB16.2dB0.9510.93810dB18.2dB19.0dB19.5dB0.9680.954这组数据的解释思路是IIR的信噪比提升量普遍比FIR高2dB左右因为IIR过渡带更陡、阻带衰减更大但相关系数FIR更高说明FIR线性相位特性让波形失真更小。于是得出一对矛盾——噪声抑制能力和语音保真度之间存在取舍这正是方案里值得重点分析的结论。5. 容易翻车的四个常见问题与排查方法5.1 滤波后波形出现振铃振荡语音听起来发闷现象滤波后的时域波形在语音起始和结束位置出现高频振荡尾巴听感出现类似金属感的回声。原因FIR阶数过高导致脉冲响应尾部振荡或过渡带设置过窄导致频域吉布斯效应。解决降低滤波器阶数例如从128阶降到64阶放宽过渡带带宽检查幅频响应曲线在截止频率附近是否有明显过冲。通常用64阶、800Hz过渡带可以把振铃抑制到听感可接受范围内。5.2 FFT频谱图在低频段出现密集毛刺主峰不明显现象画出的频谱图整个低频段都在抖动看不出语音共振峰结构。原因一是没有加窗二是FFT点数不足导致频谱泄露严重。解决先给时域信号乘以hann(N)窗函数再交给fft同时把NFFT的值扩大到length(x)的2倍或4倍观察频谱包络是否变平滑。5.3 自己算的输出信噪比和MATLAB自带的snr函数结果不一致现象同一段信号手写公式算出15dBsnr(x, noise)却算出18dB差值恰好3dB。原因snr函数默认计算的是含噪声信号总功率和噪声功率的比值而手写公式用的是干净参考信号功率两者在噪声功率占比不同时结果自然不同如果信号非零均值snr还会先扣除直流分量。解决统一公式口径报告里写明用的是哪种定义建议直接用手写公式便于控制。5.4 滤波后的语音幅值整体变小波形被削了一截现象滤波前后幅值对比滤波后整体幅度降到原来的70%左右听感音量变小。原因滤波器通带增益不是理想的1过渡带附近有了损耗加上filter默认初始状态为0信号起始段需要一段建立时间导致开头被衰减。解决用filtfilt替代filter消除起始暂态如果必须用filter在滤波前用filtic设置初始条件或直接丢弃输出信号前200个采样点。6. 验收与答辩把这些检查项过一遍才算完成课设的验收不是代码能跑就行我习惯自己先按答辩标准检查一遍。通常使用下面这个验收清单每项都过了才打包提交。检查项验收标准是否通过参数可配采样率、信噪比、截止频率可在主脚本顶部修改是/否结果可复现运行两次生成相同结果固定随机种子是/否中间结果完整干净语音、带噪语音、滤波输出的时域波形和频谱图均有存档是/否指标有计算输出信噪比和相关系数有定量结果并与滤波器选型对应是/否对比有结论FIR与IIR的性能差异能口头解释清楚是/否准备答辩演示时我通常只准备一张图就是带噪语音和两种滤波结果的频谱对比图。围绕这张图讲三条线先指出加噪后高频段噪声能量均匀分布再说FIR把高频切掉了但过渡带较宽所以残余噪声偏多最后说IIR抑制更彻底但时域波形相关性略低。这三句话能把滤波原理、参数选择和实验结果全部串起来也方便引导后面的提问方向。从那以后我每次做完课设都会强制走一遍改参数、重跑、看指标是否按预期变化的循环比如把截止频率从2200改成1800观察输出信噪比是升还是降再想清楚为什么。这一步能过滤掉大多数演示翻车的可能真正到了答辩环节就不用担心老师临时改参数来试探你了。希望这份方案能帮你少走一些弯路早点把精力留给真正能加分的内容。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑