语音信号处理-语音信号短时时域分析实验

实验三 语音信号短时时域分析实验

一、实验目的

  1. 了解语音信号短时时域分析的原理;
  2. 掌握短时时域分析的一些参数计算方法;
  3. 根据原理能编程实现短时时域分析的参数计算。

二、实验要求

  1. 实现短时能量、短时平均幅度和短时过零率的计算
  2. 实现短时自相关和短时平均幅度差

三、实验程序

相关函数:

%短时能量计算函数
function para=STEn(x,win,inc)
    X=enframe(x,win,inc)';     % 分帧
    fn=size(X,2);              % 求出帧数
    for i=1 : fn
        u=X(:,i);              % 取出一帧
        u2=u.*u;               % 求出能量
        para(i)=sum(u2);         % 对一帧累加求和
    end
 end
%短时平均幅度计算函数
function para=STMn(x,win,inc)
    X=enframe(x,win,inc)';     % 分帧
    fn=size(X,2);              % 求出帧数
    for i=1 : fn
        u=X(:,i);              % 取出一帧
        para(i)=sum(abs(u))/200;         % 对一帧累加求和
    end
 end
%短时过零率计算函数
function para=STZcr(x,win,inc)
    X=enframe(x,win,inc)';        % 分帧
    fn=size(X,2);                       % 求出帧数
    wlen=length(win);               % 求出帧长
    para=zeros(1,fn);                 % 初始化
    for i=1:fn
        z=X(:,i);                           % 取得一帧数据
        for j=1: (wlen- 1) ;            % 在一帧内寻找过零点
             if z(j)* z(j+1)< 0         % 判断是否为过零点
                 para(i)=para(i)+1;   % 是过零点,记录1次
             end
        end
    end
 end
%短时自相关函数
function para=STAc(X)
    para=zeros(size(X));
    fn=size(X,2);                            % 求出帧数
    wlen=size(X,1);                         %求帧长
    for i=1 : fn
        u=X(:,i);                               % 取出一帧
        R=xcorr(u);                         %短时自相关计算
        para(:,i)=R(wlen,end);          %只取k为正值的自相关函数
    end
 end
%短时平均幅度差函数
function para=STAmdf(X)
    para=zeros(size(X));
    fn=size(X,2);              % 求出帧数
    wlen=size(X,1);
    for i=1 : fn
        u=X(:,i);              % 取出一帧
        for k=1:wlen
            para(:,k)=sum(abs(u(k:end)-u(1:end-k+1)));      %求每个样本点的幅度差
        end
    end
 end

整体代码:

%实验要求:短时时域分析参数计算并显示
clear all; clc; close all;

[x,Fs]=audioread('block.wav');       % 读入数据文件

wlen=200; inc=100;          % 给出帧长和帧移
win=hanning(wlen);          % 给出海宁窗
N=length(x);                    % 信号长度
time=(0:N-1)/Fs;                % 计算出信号的时间刻度
En=STEn(x,win,inc);             %短时能量
Mn=STMn(x,win,inc);             %短时平均幅度
Zcr=STZcr(x,win,inc);              %短时过零率
%此处和上述3个参数不同,返回的不是向量而是矩阵,因为一帧信号得到的不是一个数值
X=enframe(x,win,inc)';     % 分帧
xn=X(:);
Ac=STAc(X);                         %计算短时自相关
Ac=Ac(:);
Amdf=STAmdf(X);             %计算短时幅度差
Amdf=Amdf(:);

fn=length(En);             % 求出帧数

figure(1)
subplot 311; plot(time,x,'b'); axis tight% 画出时间波形 
title('(a)语音波形');
ylabel('幅值'); xlabel(['时间/s' 10 ]); 
frameTime=FrameTimeC(fn,wlen,inc,Fs);   % 求出每帧对应的时间
subplot 312; plot(frameTime,Mn,'b')     % 画出短时幅度图
title('(b)短时幅度');
ylabel('幅值'); xlabel(['时间/s' 10 ]);  
subplot 313; plot(frameTime,En,'b')     % 画出短时能量图
title('(c)短时能量');
ylabel('幅值'); xlabel(['时间/s' 10 '(b)']);

 figure(2)
subplot 211; plot(time,x,'b'); axis tight% 画出时间波形 
title('(a)语音波形');
ylabel('幅值'); xlabel(['时间/s' 10 ]); 
subplot 212; plot(frameTime,Zcr,'b')     % 画出短时过零率图
title('(b)短时过零率');
ylabel('幅值'); xlabel(['时间/s' 10 ]);  


figure(3)
subplot 211; plot(xn,'b'); % 画出时间波形 
title('(a)语音波形');
ylabel('幅值'); xlabel(['点数' 10 ]); 
subplot 212; plot(Ac,'b')                    % 画出短时自相关图
title('(b)短时自相关');
ylabel('幅值'); xlabel(['点数' 10 ]);  


figure(4)
subplot 211; plot(xn,'b'); % 画出时间波形 
title('(a)语音波形');
ylabel('幅值'); xlabel(['点数' 10 ]); 
subplot 212; plot(Amdf,'b')                     % 画出短时幅度差
title('(b)短时幅度差');
ylabel('幅值'); xlabel(['点数' 10 ]);  


四、实验结果

  1. 实现短时能量、短时平均幅度和短时过零率的计算
    在这里插入图片描述
    在这里插入图片描述
  2. 实现短时自相关和短时平均幅度差
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51380854/article/details/127787480