通过matlab实现语音信号的时域分析,要分析的有语音信号的时域波形、短时平均能量、不同长度的窗时的短时能量、短时平均幅度、短时平均过零率、短时自相关函数等。
下面介绍分析的代码。
画出语音信号的时域波形
clc;clear
[x1,fs]=audioread('C:\Users\Administrator\Desktop\123.mp3'); %读取语音信号
sound(x1,fs); %播放语音信号
plot(x1) %做原始语音信号的时域图形
title('原始语音信号');
绘制语音信号短时平均能量
clc;clear
[x,fs]=audioread('C:\Users\Administrator\Desktop\123.mp3'); %读取语音信号
subplot(2,1,1); plot(x)
title('原始语音信号');
s=enframe(x,50,50);
s2=s.^2;
energy=sum(s2,2);
subplot(2,1,2); plot(energy)
title('短时能量');
legend ('N=50');
选择不同长度的窗时的短时能量
% 短时能量
fid=fopen('zqq.txt','rt'); %读入语音文件
x=fscanf(fid,'%f');
fclose(fid);
%计算N=50,帧移=50时的语音能量
s=fra(50,50,x);
s2=s.^2; %一帧内各样点的能量
energy=sum(s2,2); %求一帧能量
subplot(2,2,1) %定义画图数量和布局
plot(energy) %画N=50时的语音能量图
xlabel('帧数') %横坐标
ylabel('短时能量 E') %纵坐标
legend('N=50') %曲线标识
axis([0,1500,0,2*10^10]); %定义横纵坐标范围
%计算N=100,帧移=100时的语音能量
s=fra(100,100,x);
s2=s.^2;
energy=sum(s2,2);
subplot(2,2,2)
plot(energy) %画N=100时的语音能量图
xlabel('帧数')
ylabel('短时能量 E')
legend('N=100')
axis([0,750,0,4*10^10]) %定义横纵坐标范围
%计算N=400,帧移=400时的语音能量
s=fra(400,400,x);
s2=s.^2;
energy=sum(s2,2);
subplot(2,2,3)
plot(energy) %画N=400时的语音能量图
xlabel('帧数')
ylabel('短时能量 E')
legend('N=400')
axis([0,190,0,1.5*10^11]) %定义横纵坐标范围
%计算N=800,帧移=800时的语音能量
s=fra(800,800,x);
s2=s.^2;
energy=sum(s2,2);
subplot(2,2,4)
plot(energy) %画N=800时的语音能量图
xlabel('帧数')
ylabel('短时能量 E')
legend('N=800')
axis([0,95,0,3*10^11]) %定义横纵坐标范围
对信号求其短时平均幅度
% 短时幅度
fid=fopen('zqq.txt','rt'); %读入语音文件
x=fscanf(fid,'%f');
fclose(fid)
s=fra(50,50,x); %语音短时平均幅度图
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,1)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=50')
axis([0,1500,0,10*10^5])
s=fra(100,100,x);
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,2)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=100')
axis([0,750,0,2*10^6])
s=fra(400,400,x);
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,3)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=400')
axis([0,190,0,7*10^6])
s=fra(800,800,x);
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,4)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=800')
axis([0,95,0,14*10^6])
% 短时幅度
fid=fopen('zqq.txt','rt'); %读入语音文件
x=fscanf(fid,'%f');
fclose(fid)
s=fra(50,50,x); %语音短时平均幅度图
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,1)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=50')
axis([0,1500,0,10*10^5])
s=fra(100,100,x);
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,2)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=100')
axis([0,750,0,2*10^6])
s=fra(400,400,x);
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,3)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=400')
axis([0,190,0,7*10^6])
s=fra(800,800,x);
s3=abs(s);
avap=sum(s3,2);
subplot(2,2,4)
plot(avap)
xlabel('帧数')
ylabel('短时平均幅度 M')
legend('N=800')
axis([0,95,0,14*10^6])
画出信号的短时平均过零率的曲线
% 过零率
clear all
fid=fopen('beijing.txt','rt');
x1=fscanf(fid,'%f');
fclose(fid);
x=awgn(x1,15,'measured');%加入15dB的噪声
s=fra(220,110,x);%分帧,帧移110
zcr=zcro(s);%求过零率
figure(1);
subplot(2,1,1)
plot(x);
title('原始信号');
xlabel('样点数');
ylabel('幅度');
axis([0,39760,-2*10^4,2*10^4]);
subplot(2,1,2)
plot(zcr);
xlabel('帧数');
ylabel('过零次数');
title('原始信号的过零率');
axis([0,360,0,200]);
画出信号的短时自相关函数的曲线
% 自相关
fid=fopen('voice.txt','rt')
x=fscanf(fid,'%f');
fclose(fid);
s1=x(1:320); %选择一段320点的语音段
N=320; %选择的窗长
A=[]; %加N=320的矩形窗
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+s1(m)*s1(m+k-1); %计算自相关
end
A(k)=sum;
end
for k=1:320
A1(k)=A(k)/A(1); %归一化A(k);
end
f=zeros(1,320); %加N=320的哈明窗
n=1;j=1;
while j<=320
f(1,j)=x(n)*[0.54-0.46*cos(2*pi*n/320)];
j=j+1;n=n+1;
end
B=[];
for k=1:320;
sum=0;
for m=1:N-k+1;
sum=sum+f(m)*f(m+k-1);
end
B(k)=sum;
end
for k=1:320
B1(k)=B(k)/B(1);%归一化B(k)
end
s2=s1/max(s1);
figure(1)
subplot(3,1,1)
plot(s2)
title('一帧语音信号')
xlabel('样点数')
ylabel('幅值')
axis([0,320,-1,1]);
subplot(3,1,2)
plot(A1);
title('加矩形窗的自相关函数')
xlabel('延时 k')
ylabel('R(k)')
axis([0,320,-1,1]);
subplot(3,1,3)
plot(B1);
title('加哈明窗的自相关函数')
xlabel('延时 k')
ylabel('R(k)')
axis([0,320,-1,1]);
代码仅供参考