%该程序读wav文件,然后显示频谱以及波形。注意wav文件不要太长,否则运算会很慢。
[y,fs]=audioread('17-30.wav');
fs
sigLength=length(y);
Y = fft(y,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));xlabel('频率/Hz'); ylabel('幅度');
t=(0:sigLength-1)/fs;
figure;plot(t,y);xlabel('时间/s');ylabel('幅度');
%%%%画出声音对应的频谱图
clear all;
clc;
[w,fs,bits]=wavread('17-30.wav');%读取声音数据,fs表示采样频率(Hz),bits表示采样位数。
figure;
%subplot(1,3,1);
plot(w);
title('原始语音');
axis([1 length(w) -1 1]);
grid;
%用specgram函数做语谱图
Nf=512;%FFT采样点数
FrameLen=160;%帧长
FrameInc=80;%帧移,
FrameCha=FrameLen-FrameInc;%帧差
figure;
%subplot(1,2,1);
specgram(w,Nf,fs,FrameLen);
colormap gray
%specgram(a,nfft,fs,window),nfft指定specgram函数所用FFT长度
%,该值决定了计算短时傅立叶变换的各频点;参数fs是指定采样频率的一个标量;
%参数window指定了一个窗函数以及specgram函数用以分割矢量a的样点数;
title('specgram语谱图');
%分帧
N=length(w);%语音长
Num=ceil((N-FrameLen)/FrameCha)+1;%分帧数目
yframe=enframe(w,FrameLen,FrameInc);%调用分帧函数,函数enframe.m中对每帧数据加Hamming窗
Win=hamming(FrameLen);%定义汉明窗
A=[];%存放FFT后的数据
for i=1:Num
ys=yframe(:,i).*Win;%对每帧数据加窗
ys=fft(ys,Nf);
ys=ys(1:Nf/2);
%ys=fftshift(ys);%作用:将零频点移到频谱的中间
ys=abs(ys);%傅里叶变换取模
ys=(ys.^2)/FrameLen;
ys=10*log10(ys);
A(:,i)=ys;
end
%自己做的语谱图
figure;
%subplot(1,2,2);
x=0:0.01:N/fs;%横轴时间
y=[0:Nf/2]*fs/Nf;
imagesc(x,y,A);%将输入变量L显示为图像,并且使用x和y变量确定x轴和y轴的边界。
axis xy;
title('自己做的语谱图');
网友评论