信号的语谱图

本文探讨了语音信号分析中的语谱图概念,并通过对比窄带与宽带语谱图的特点,展示了不同窗函数对语音信号分析的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号的语谱图

2.1带限信号特性

语音中设计窗函数,窗函数性质大同小异,这里以窗函数为对象进行分析。

对于时域的窗函数:

其表达式为:

对应的傅里叶变换:

 

 

表达式为:

可见信号的时宽越大(小),信号的频带宽度越小(大),对于矩形窗,有着带宽B与时宽乘积为这样的特性,其他窗函数也有着类似的性质。

MATLAB仿真举例:

根据上面的分析,信号长度定为2000(即2*pi的长度)的话,矩形窗为40,要满足时宽与带宽乘积为2000不变,理论上带宽应为50,一下的结果图验证了上面的理论:

 

由于语音信号具有短时平稳特性,因此对其分析时,要进行加窗处理,借助上面的分析,可以看出,窗长如果选择短一些的话,就是时宽较小,对应的带宽就要大一些,在这种情况下得到的就是宽带语谱图,反之则得到窄带语谱图。

2.2 窄带语谱图

对于一段语音进行分析(语音内容为0 1 2 3 4 5 6 7 8 9),语音采样率为8000Hz,取窗长为512个数据点,帧移为窗长的1/4,即128个数据点。

得到如下结果图:

从结果图中可以清楚看到谐波的结构,频率分辨率非常好,但是时间上的分辨率就不理想。对于上述语音,画出其频率特性:

语音低频部分(红线)体现了声道的特性,窄带语谱图,频率分辨率太过精细,不能很好体现出共振峰的大致位置,即反映不出基波的变化特性。

 

2.3宽带语谱图

对于一段语音进行分析(语音内容为0 1 2 3 4 5 6 7 8 9),语音采样率为8000Hz,取窗长为128个数据点,帧移为窗长的1/4,即32个数据点。

得到如下结果图:

 

 

与窄带语谱图相反,宽带语谱图的时间分辨率很好,频率分辨率较低,不能很好反映声音的纹理特性,反映了频谱的时变特性,能很好分辨出共振峰的大致位置,但分辨不清谐波结构。

### 使用 MATLAB 绘制信号语谱图 要生成信号语谱图,可以通过以下方法完成。此过程涉及读取音频文件、分帧加窗、傅里叶变换以及最终显示语谱图。 #### 1. 音频数据加载 首先需要使用 `audioread` 函数来加载音频文件并获取采样率: ```matlab [x, fs] = audioread('speech.wav'); ``` 这里 `x` 是音频信号的数据向量,而 `fs` 表示采样频率[^2]。 #### 2. 设置参数 定义帧长度和帧重叠比例作为预处理的一部分: ```matlab frameLength = 256; % 帧长 overlap = 0.5; % 帧重叠率 (百分比形式表示) ``` 这些参数决定了每一段用于分析的时间窗口大小及其之间的交叠程度。 #### 3. 分帧与加窗 利用缓冲区函数 `buffer` 对信号进行分割成固定长度的小段,并应用汉明窗减少边界效应的影响: ```matlab frames = buffer(x, frameLength, round(frameLength * overlap), 'nodelay'); window = hamming(frameLength); frames = frames .* repmat(window, 1, size(frames, 2)); ``` 上述代码片段实现了对原始信号按指定条件划分的同时施加了平滑作用以降低噪声干扰[^2]。 #### 4. 计算短时傅立叶变换(STFT) 接着计算每一帧对应的离散傅里叶变换(DFT),从而获得各时刻下的频域特性: ```matlab spectrogramData = abs(fft(frames)).^2; frequencies = linspace(0, fs/2, floor(frameLength / 2) + 1); timeStamps = ((0:size(frames, 2)-1)*frameLength/fs)/((1-overlap)*frameLength/fs); ``` 这段程序不仅完成了幅度平方运算得到功率谱密度估计值,同时也构建出了对应于各个轴方向上的坐标系点位集合以便后续绘操作之需。 #### 5. 可视化结果 最后一步就是调用像渲染命令把所得数值转化为直观可见的形式呈现出来: ```matlab figure; imagesc(timeStamps, frequencies, log(spectrogramData(1:floor(end/2)+1,:))); colormap jet; colorbar; xlabel('时间(秒)'); ylabel('频率(赫兹)'); title('信号语谱图'); axis xy; ``` 这样就成功创建了一幅反映声音强度变化规律随时间和频率分布状况的经典形——即所谓的“语谱图”。它能够清晰地显示出哪些特定时间段内存在何种频率成分最为活跃的情况[^2]。 ```matlab % 完整示例代码如下: [x, fs] = audioread('speech.wav'); frameLength = 256; overlap = 0.5; frames = buffer(x, frameLength, round(frameLength * overlap), 'nodelay'); window = hamming(frameLength); frames = frames .* repmat(window, 1, size(frames, 2)); spectrogramData = abs(fft(frames)).^2; frequencies = linspace(0, fs/2, floor(frameLength / 2) + 1); timeStamps = ((0:size(frames, 2)-1)*frameLength/fs)/((1-overlap)*frameLength/fs); figure; imagesc(timeStamps, frequencies, log(spectrogramData(1:floor(end/2)+1,:))); colormap jet; colorbar; xlabel('时间(秒)'); ylabel('频率(赫兹)'); title('信号语谱图'); axis xy; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值