FRCRN处理前后频谱分析:用Matlab进行可视化效果验证

📅 发布时间:2026/7/4 12:27:06 👁️ 浏览次数:
FRCRN处理前后频谱分析:用Matlab进行可视化效果验证
FRCRN处理前后频谱分析用Matlab进行可视化效果验证语音增强技术听起来挺高大上的但说白了就是想办法把一段录音里的噪音去掉让说话声更清楚。最近几年像FRCRN这样的深度学习模型在这块表现很亮眼效果确实比传统方法强不少。不过光说效果好没用我们得亲眼看看它到底是怎么把噪音“干掉”的。今天我就带你用Matlab这个老朋友亲手把FRCRN处理前后的音频文件打开看看它们的频谱图到底有什么不同。我们会用短时傅里叶变换STFT这个工具把声音信号变成一张张“声学照片”然后对比一下噪音被抑制了多少人声又保留得怎么样。整个过程我都会配上代码你完全可以自己跑一遍感受一下这种从“听”到“看”的验证过程非常直观。1. 准备工作理解我们要做什么在动手写代码之前我们先花几分钟把整个思路理清楚。这样后面看代码和结果的时候你心里就有谱了。1.1 核心工具短时傅里叶变换STFT你可能听过傅里叶变换它能告诉我们一段声音里有哪些频率成分。但普通傅里叶变换是针对整段信号的我们听不出声音是何时变化的。STFT就聪明多了它把一段长的声音信号切成很多小段就像把电影切成一张张胶片然后对每一小段做傅里叶变换。这样我们就能得到一张图横轴是时间纵轴是频率颜色深浅代表能量强弱。这张图就是频谱图声音随时间变化的“指纹”全在上面了。对于语音增强频谱图简直是“照妖镜”。人声比如元音通常在低频部分比如100-1000 Hz有稳定的能量带而很多噪音比如风扇声、键盘敲击声则可能表现为高频的散点或特定频带的能量块。通过对比处理前后的频谱图噪音抑制效果一目了然。1.2 分析目标FRCRN处理前后对比假设我们已经有了两个WAV文件noisy_speech.wav带噪语音和enhanced_speech.wavFRCRN增强后的语音。我们的任务就是用Matlab把它们读进来。分别计算它们的频谱图。把两张频谱图并排放在一起直观对比。更进一步我们可以定量分析某个特定噪音频段比如2000-4000 Hz的能量被削弱了多少。这个过程就像给声音做“体检”拍两张X光片频谱图一张是病中带噪一张是治疗后增强对比一下就知道疗效如何了。2. 实战开始Matlab代码分步解析理论说再多不如一行代码。我们直接进入Matlab环境一步步实现上面的想法。我会把完整的脚本拆解开详细解释每一部分是干什么的。2.1 读取音频文件与基本参数设置第一步当然是准备好我们的“病人”样本。同时我们也要设定好给声音“拍片”STFT的“相机参数”。% 步骤1读取音频文件 [noisy_signal, fs] audioread(noisy_speech.wav); % 读取带噪语音fs是采样率 enhanced_signal audioread(enhanced_speech.wav); % 读取增强后的语音 % 确保两个信号长度一致如果FRCRN输出长度有微小差异进行裁剪 min_len min(length(noisy_signal), length(enhanced_signal)); noisy_signal noisy_signal(1:min_len); enhanced_signal enhanced_signal(1:min_len); % 步骤2设置STFT参数 window_length round(0.025 * fs); % 窗长25ms这是语音处理的常用值 overlap_length round(0.015 * fs); % 重叠15ms nfft 2^nextpow2(window_length); % FFT点数取2的幂次计算效率高 % 创建汉宁窗。窗函数的作用是让每段信号平滑地开始和结束减少截断带来的影响。 window hann(window_length, periodic);这里有几个关键点audioread函数不仅读入了音频数据还得到了采样率fs比如16000 Hz这个值至关重要。窗长window_length决定了时间分辨率重叠overlap_length让“胶片”之间衔接更平滑。25ms窗长是语音分析的黄金标准之一。nfft决定了频率轴的精细程度频率分辨率。2.2 计算并绘制频谱图参数设好了“相机”也调好了现在开始“拍照”并“洗照片”绘图。% 步骤3计算带噪语音的频谱图 [S_noisy, F_noisy, T_noisy] spectrogram(noisy_signal, window, overlap_length, nfft, fs, yaxis); % S_noisy是复数矩阵包含幅度和相位信息。我们通常关心幅度谱。 P_noisy 10*log10(abs(S_noisy).^2 eps); % 转换为分贝(dB)尺度更符合人耳感知。eps防止log10(0)出错。 % 步骤4计算增强后语音的频谱图 [S_enhanced, F_enhanced, T_enhanced] spectrogram(enhanced_signal, window, overlap_length, nfft, fs, yaxis); P_enhanced 10*log10(abs(S_enhanced).^2 eps); % 步骤5并排绘制频谱图进行对比 figure(Position, [100, 100, 1200, 500]) % 设置一个宽一点的图形窗口 % 子图1带噪语音频谱图 subplot(1,2,1) imagesc(T_noisy, F_noisy/1000, P_noisy) % F_noisy单位是Hz除以1000转换为kHz axis xy % 确保频率从低到高显示 colormap(jet) % 使用‘jet’颜色映射对比度强 colorbar title(带噪语音频谱图 (Noisy Speech Spectrogram)) xlabel(时间 (秒)) ylabel(频率 (kHz)) clim([-80, 0]) % 统一颜色轴范围方便对比。这个范围适合大多数语音场景。 % 子图2增强后语音频谱图 subplot(1,2,2) imagesc(T_enhanced, F_enhanced/1000, P_enhanced) axis xy colormap(jet) colorbar title(FRCRN增强后频谱图 (Enhanced Speech Spectrogram)) xlabel(时间 (秒)) ylabel(频率 (kHz)) clim([-80, 0]) % 使用与左图相同的颜色轴范围 % 添加一个总标题 sgtitle(FRCRN语音增强前后频谱对比, FontSize, 14, FontWeight, bold)运行这段代码你就能得到最核心的视觉对比图。imagesc函数将矩阵数据映射为图像clim命令确保两张图用同一把“颜色尺子”来衡量能量大小这样对比才公平。2.3 定量分析噪音频段能量抑制计算看图已经很直观了但我们还可以用数据说话。比如我们怀疑高频段比如2kHz以上有噪音那就定量算算这部分能量被削弱了多少。% 步骤6定量分析特定频段的能量抑制效果 % 假设我们想分析高频噪音例如 2000 Hz 以上的抑制情况 target_freq_min 2000; % 起始频率 (Hz) target_freq_max 4000; % 终止频率 (Hz)你可以根据你的噪音特性调整 % 找到目标频率对应的索引 idx_freq find(F_noisy target_freq_min F_noisy target_freq_max); % 计算带噪语音在目标频段的总能量在dB尺度下需要先转换回线性尺度求和 energy_noisy_band sum(10.^(P_noisy(idx_freq, :) / 10), all); % 计算增强后语音在目标频段的总能量 energy_enhanced_band sum(10.^(P_enhanced(idx_freq, :) / 10), all); % 计算能量抑制比 (Suppression Ratio) suppression_ratio_db 10 * log10(energy_noisy_band / energy_enhanced_band); fprintf( 定量分析结果 \n); fprintf(分析频段: %.1f kHz - %.1f kHz\n, target_freq_min/1000, target_freq_max/1000); fprintf(带噪语音频段能量: %.2e (线性值)\n, energy_noisy_band); fprintf(增强后频段能量: %.2e (线性值)\n, energy_enhanced_band); fprintf(能量抑制比: %.2f dB\n, suppression_ratio_db); if suppression_ratio_db 0 fprintf(说明在该频段噪音能量被抑制了约 %.2f dB。\n, suppression_ratio_db); else fprintf(说明在该频段能量不降反升可能发生了失真或引入了新噪声。\n); end这个计算给出了一个具体的数值指标。如果suppression_ratio_db是10 dB那就意味着在那个频段噪音能量被降到了原来的十分之一。这是一个非常有力的证据。3. 效果展示与分析从图中看到了什么现在让我们把代码跑出来的结果当成一张张医学影像来“读片”。我以一段混有“滋滋”高频噪音的语音为例。当你运行完脚本会看到类似下图的并排对比。虽然我无法在这里展示真实的图片但可以详细描述你通常会观察到的现象观察维度带噪语音频谱图 (左图)FRCRN增强后频谱图 (右图)说明与解读整体背景整个背景布满细密的、颜色较浅如绿色的颗粒或条纹尤其在非语音段静默处也很明显。背景干净了许多静默处呈现出深蓝色低能量整体“底噪”水平显著下降。这表明FRCRN有效抑制了平稳的背景噪声。人声谐波结构低频区域0-1kHz能看到颜色较深红色/黄色的横条那是人声的基频和谐波但它们可能被背景噪声模糊了边界。同样的谐波结构变得更加清晰、锐利红色横条与蓝色背景的对比度增强。意味着语音成分被更好地保留和突出了语音质量清晰度提升。特定噪音频带可能在2-4kHz区域有一片持续的能量带比如风扇噪音或者在多个区域有随机出现的亮斑瞬时噪音。这些特定的高能量区域明显减弱或消失该频段的颜色变深。直观展示了模型对特定噪声模式的识别和去除能力。时间轴上的瞬态噪音在某个时间点比如第1.5秒可能出现一个垂直的亮线“咔哒”声。该垂直亮线基本消失或大幅减弱。说明模型对瞬时脉冲噪声也有较好的抑制效果。定量结果解读 假设我们针对2-4 kHz这个疑似风扇噪音的频段做了计算输出结果可能是 定量分析结果 分析频段: 2.0 kHz - 4.0 kHz 带噪语音频段能量: 5.67e04 (线性值) 增强后频段能量: 8.91e03 (线性值) 能量抑制比: 8.05 dB 说明在该频段噪音能量被抑制了约 8.05 dB。这个8.05 dB的数字给“效果明显”这个主观感受提供了一个客观的锚点。它证实了从频谱图上看到的“那片绿色区域变淡了”确实对应着能量的大幅下降。4. 让分析更深入一些实用的进阶思路基础的对比做完如果你还想挖得更深一点这里有几个马上就能试的扩展方向更换窗函数和参数试试把hann窗换成hamming窗或者把窗长从25ms改成32ms、16ms。你会发现频谱图的时间分辨率和频率分辨率会此消彼长窗长越长频率看得越细频率分辨率高但时间上的定位会变模糊时间分辨率低。这能帮你理解STFT参数对分析结果的影响。分析全局信噪比SNR改善除了看特定频段还可以粗略估算整个频带的改善。计算原始信号和增强后信号的总能量在时域或频域它们的比值取对数可以近似反映整体信噪比提升。不过要注意这只是一个粗略估计因为纯净语音参考信号未知。聆听对应片段频谱图再直观也不能代替耳朵。用Matlab的soundsc函数播放你正在分析的这一小段音频比如噪音最明显的那2秒钟对比聆听处理前后的效果。视觉和听觉结合你的理解会更深。尝试其他可视化除了用imagesc还可以用surf函数绘制3D频谱曲面从另一个角度观察能量分布。或者在某个特定时间点比如人声元音最稳定的时刻切出一帧频谱画两条线处理前后进行对比看得更精确。5. 总结走完这一趟你应该不再觉得频谱分析是什么神秘的黑盒子了。它就是一个非常实用的工具把FRCRN这类语音增强模型的“工作成果”清晰地摆在桌面上。通过Matlab我们从读取数据、计算STFT、绘图对比到定量计算完成了一个完整的、可复现的效果验证流程。这种可视化验证的价值在于它不仅是给结果“拍个照”更是提供了一个分析问题的视角。当你调整模型参数、尝试不同的预处理方法或者处理另一种类型的噪音时这套方法可以立刻复用帮你快速定位效果是变好了还是变差了问题出在哪个频段、哪个时间点。最后代码本身并不复杂关键是理解每一步背后的意图。希望这个从“听到看”的过程能帮你更扎实地理解语音增强技术也让你手里的Matlab多了一件解决问题的利器。下次再评估一个音频处理算法时不妨先把它“画”出来看看。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。