specgram(x1,N,fs,window,overlap):绘制语谱图,其中,
- x1:语音向量,注意单声道双声道的问题
- N:fft个数
- s:采样频率
- window:帧长,即加窗处理中的窗长
- overlap:帧移,帧长重叠部分,一般重叠部分取50%
specgram函数绘制语谱图有两种方式:
- 无输出参数,直接画图
- 有输出参数,可以通过返回值画图,此方法除了绘制语谱图,还可以绘制时域波形图和频谱图
matlab程序:
mkdir('C:\Users\如初\Desktop\matlab程序\specgram\');%新建存放语谱图的文件夹
file='C:\Users\如初\Desktop\matlab程序\';%声音信号所在文件夹
file1=strcat(file,'*.wav');%file1='C:\Users\如初\Desktop\matlab程序\*.wav'(strcat:连接多个字符串)
file2=dir(file1);%获取文件夹下所有的wav文件(dir:读取文件夹下所有文件和文件夹/特定后缀的文件)
k=length(file2);%计算wav文件个数(length:数组长度,行数或者列数的较大值 size:数组的行数和列数 numel:元素总数)
R=1024;%窗长
window=hamming(R);%汉明窗
N=1024;%fft个数,与窗长相同
L=512;%步长
overlap=R-L;%帧长重叠部分,也叫帧移,一般重叠部分为50%
for i=1:k
file3=strcat(file,file2(i).name);%单个音频的绝对路径
[x,fs]=audioread(file3);%读取单个音频,fs是采样频率
x1=x(:,1)%x为双声道,所以后面取单声道数据
%plot(x1)%可以画波形图
file4=strcat('C:\Users\如初\Desktop\matlab程序\specgram\',file2(i).name,'.jpg')%语谱图命名方式和存储文件夹
%x1=awgn(x1,100,'measured','linear');%可以加白噪
figure(i);
specgram(x1,N,fs,window,overlap);%第一种:specgram无输出的时候,直接画出来
saveas(gca,file4)%保存语谱图图片
%[B,f,t]=specgram(x(:,1),N,fs,window,overlap);%第二种:specgram输出返回值,其中B为振幅,f为频率,t为时间
%imagesc(t,f,20*log10(abs(B)));%根据返回参数,画出语谱图(imagesc:画图,参数分别为横坐标范围、纵坐标范围和数值),除了语谱图还可以画别的
%plot(f,20*log10(abs(B(:,21))))%频域:B(:,21)对应的是t[21]=0.23s时的频谱
%plot(t,20*log10(abs(B(21,:))))%时域:B(21:,:)对应的是f[21]=816.32Hz时的时域波形
%colormap(cool);%图形变色系
%axis xy%注意axis ij和axis xy的区别
%xlabel('时间/s');%横坐标命名
%ylabel('频率/kHz');%纵坐标命名
end