注意这里面的WAV文件是双声道的,窗函数选的是汉宁窗
clc;
clear all;
close all;
[filename,pathname]=uigetfile('*.wav','请选择语音文件:');
[y,fs,Nbits]=wavread([pathname,filename]); % y里面放的是采样的数值;fs是采样频率;bits表示采样位数
N=length(y); %信号长度
sound(y,fs,Nbits);
framelength=200; %给出帧长framelength,
frameshift=80; %给出帧移frameshift
hanning_window=hanning(framelength); %给出汉宁窗
Y=enframe(y,framelength,frameshift); %分帧
figure(1);plot(Y),xlabel('帧');ylabel('幅值');title('Hanning-分帧加窗后矩阵');
time=(0:N-1)/fs; %计算出信号的时间刻度,即坐标
figure(2);
plot(time,y);title('语音文件的时间波形');ylabel('幅值');xlabel('时间/s');
n=size(Y);
for i=1:n(1)
frame_energy(i)=Y(i,:)*Y(i,:)';
end
figure(3);plot(frame_energy),xlabel('帧');title('Hanning-短时能量图');ylabel('幅值');
a=sign(Y);
framenumber=size(Y,2); %帧数
zcr1=zeros(1,n(1)); %初始化
c=[zcr1' a];
d=[a zcr1'];
zcr=d-c;
zcr=(0.5*sum(abs(zcr),2))/(n(2)-1);
%zcr=0.5*sum(abs(zcr),2);
figure(4)
plot(zcr);xlabel('帧');title('Hanning-过零率');ylabel('幅值');
fp=fopen('E:\MatlabCode\ouyangrui_hanningwin信号数据.txt','wt');
fprintf(fp,'使用的窗函数: 汉宁窗\n');
fprintf(fp,'信号的长度:N= %d\n',N);
fprintf(fp,'采样频率:fs = %d\n',fs);
fprintf(fp,'给定的帧长= %d\n',framelength);
fprintf(fp,'给定的帧移= %d\n',frameshift);
fp1=fopen('E:\MatlabCode\ouyangrui_hanningwin分帧后数据.txt','wt');
fprintf(fp1,'使用的窗函数: 汉宁窗\n');
fprintf(fp1,'分帧后数据\n');
fprintf(fp1,'%f\t',Y);
fp2=fopen('E:\MatlabCode\ouyangrui_hanningwin分帧前数据.txt','wt');
fprintf(fp2,'使用的窗函数: 汉宁窗\n');
fprintf(fp2,'分帧后数据\n');
fprintf(fp2,'%f\t',y);
fp3=fopen('E:\MatlabCode\ouyangrui_hanningwin短时能量.txt','wt');
fprintf(fp3,'使用的窗函数: 汉宁窗\n');
fprintf(fp3,'短时能量\n');
fprintf(fp3,'%f\t',frame_energy);
fp4=fopen('E:\MatlabCode\ouyangrui_hanningwin过零率.txt','wt');
fprintf(fp4,'使用的窗函数: 汉宁窗\n');
fprintf(fp4,'过零率\n');
fprintf(fp4,'%f\t',zcr);