这实际上是很简单的,因为画语谱图是分帧以后进行的,主要应知道分帧后每帧对应的时间就能画出的语谱图和波形图对应起来。这里提供一个已知分帧参数后计算时间刻度的函数frame2time :
function frameTime=frame2time(frameNum,framelen,inc,fs)
frameTime=(((1:frameNum)-1)*inc+framelen/2)/fs;
这个函数和语谱图将在我出版的新书中将会出现并多次被引用(https://www.ilovematlab.cn/forum-173-1.html)。以下再举个例子:
clear all; clc; close all;
[x,fs]=wavread('sunday_2.wav'); % 读入数据
N=length(x); % 信号长度
time=(0:N-1)/fs; % 时间刻度
wlen=200; inc=80; % 帧长和帧移
y=enframe(x,wlen,inc)'; % 分帧
Y=fft(y); % FFT
W2=wlen/2+1;
n2=1:W2; % 正频率部分
fn=size(y,2); % 帧数
frameTime=frame2time(fn,wlen,inc,fs); % 每帧对应的时间刻度
freq=(n2-1)*fs/wlen; % 频率刻度
Y_abs=abs(Y(n2,:)); % 幅值
subplot 211; plot(time,x);
xlabel('时间/s'); ylabel('幅值'); title('信号波形图');
subplot 212;
imagesc(frameTime,freq,Y_abs); axis xy; % 画语谱图
xlabel('时间/s'); ylabel('频率/Hz'); title('语谱图');
信号在附件中(把扩展名txt改为wav),画出的波形图和语谱图如下: