matlab实现语音信号的时域分析

该代码示例展示了如何使用MATLAB进行语音信号的时域分析,包括绘制原始语音信号波形、短时平均能量、不同窗长的短时能量、短时平均幅度、短时平均过零率以及短时自相关函数。通过这些分析,可以揭示语音信号的各种特性。
摘要由CSDN通过智能技术生成

通过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]);

代码仅供参考

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小奇兵1213号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值