基于底层算法实现的自定义语音语谱图分析系统
本系统是一个基于原生算法实现的工程化语音分析工具,核心逻辑不依赖于MATLAB内置的信号处理工具箱高层函数(如spectrogram等),而是通过数字信号处理的基础数学公式,从底层构建了从时域信号到频域语谱的可视化全过程。系统涵盖了信号模拟、预加重、分帧加窗、短时傅里叶变换(STFT)以及对数能量映射等关键环节。
项目介绍
本项目旨在提供一个透明、可控的语音信号分析方案。通过手动实现数字信号处理的每一个环节,用户可以深入观测语音信号在时间与频率维度的动态演变特征。系统不仅能够处理标准的数字语音信号,还内置了具有共振峰特性的合成语音生成模块,用于演示基音周期、共振峰结构以及清音/浊音在频域上的显著差异。
功能特性
- 原生底层实现:所有信号处理逻辑(包括汉明窗生成、预加重滤波、分帧计算、功率谱密度转换)均采用基础数学公式实现。
- 动态语音模拟:内置模拟语音合成器,支持频率调制(FM)模拟基频、多重谐波模拟共振峰、以及高频白噪声模拟清音段。
- 灵活的参数化配置:允许精确调整采样频率、帧长(ms)、帧移(ms)、FFT点数以及预加重系数。
- 高对比度可视化:集成时域波形图与频域语谱图的联合显示,支持分贝刻度映射与动态范围对比度优化。
- 稳健性处理:在对数运算中引入极小值偏移,有效防止算术溢出与数值不稳定。
系统逻辑与实现细节
- 信号合成与预处理
程序首先构建一个模拟合成信号。该信号通过调频正弦波模拟人类语音的基频变动,叠加倍频信号模拟声道共振峰。在0.8s至1.2s区间插入高频随机噪声以模拟气流通过声门产生的清音特征。随后应用一阶高通滤波器(预加重)对信号进行处理,通过补偿高频分量的能量损失,使语谱图在中高频段的细节更加清晰。
- 手动分帧与加窗
系统根据用户设定的毫秒级参数计算采样点数。通过循环逻辑将连续信号切割为重叠的帧块。为了消除分帧造成的频谱泄露,系统利用余弦组合公式手动生成汉明(Hamming)窗函数。每一帧数据在进行变换前都会与生成的窗函数进行逐点相乘。
- 短时傅里叶变换(STFT)核心
这是系统的频域转换中心。程序对每一帧加窗信号执行快速傅里叶变换,提取其前半部分频谱幅值。通过平方运算获取能量密度,并利用10倍对数公式将其转化为分贝(dB)刻度。这一逻辑将原始数值中差异巨大的幅值范围压缩到更符合人类感知规律的视觉区间。
- 坐标映射与可视化展示
系统自动计算时间轴(单位:秒)与频率轴(单位:赫兹)的对应数值。使用二维图像渲染映射技术,将处理后的矩阵绘制为语谱图。通过Y轴翻转确保低频部分位于图像下方,并设置60dB的动态显示范围上限,有效剔除背景底噪干扰,凸显共振峰条纹。
实现算法说明
- 预加重算法:采用公式 y(n) = x(n) - α * x(n-1),其中α通常设定为0.97。
- 窗函数算法:基于 w(n) = 0.54 - 0.46 * cos(2πn / (N-1)) 生成汉明窗序列。
- 帧数计算逻辑:总帧数 nf = fix((信号长度 - 窗口长度) / 帧移间隔) + 1。
- 功率谱转换:P = |FFT(frame)|²,随后进行 10 * log10(P + eps) 运算。
使用方法
- 环境配置:确保已安装MATLAB R2016b或更高版本。
- 执行分析:在MATLAB命令行窗口中调用主函数。
- 交互观察:
- 观察上方子图:识别模拟语音的振幅包络变动。
- 观察下方子图:识别彩色条纹(共振峰)、垂直条纹(基音周期特性)以及高频处的散点区域(清音段)。
- 参数调整:用户可直接修改程序开头的参数设置区,如修改 win_len_ms 观察时间分辨率与频率分辨率的测不准原理权衡。
系统要求
- 软件支持:MATLAB(基础版即可,无需特定工具箱)。
- 硬件建议:标准计算环境,内存建议4GB以上以支持大规模矩阵运算。
- 输入限制:默认为合成信号,如需处理外部音频,需确保采样率与参数设置匹配。