- 题目要求
编程实现一句话语音的短时能量曲线,并比较窗长、窗口形状(以矩形窗和哈明窗为例)对短时平均能量的影响。
- 常见问题
1.未定义与 ‘double’ 类型的输入参数相对应的函数 ‘enframe’
解决办法:下载MATLAB voicebox工具包
function frameTime=frame2time(frameNum,framelen,inc,fs)
% ================= 计算分帧后每一帧对应的时间=====================
% ================= 输 入 ===================================
%frameNum : 总帧数
%framelen : 帧长
%inc : 帧移
%fs : 采样频率
%================== 输 出 ====================================
%frametime : 每帧的时间,即取这一帧数据中间位置的时间
frameTime=(((1:frameNum)-1)*inc+framelen/2)/fs;
2.未定义与 ‘double’ 类型的输入参数相对应的函数 ‘frame2time’
可在MATLAB toolbox\voicebox文件夹中添加frame2time.m文件
function frameTime=frame2time(frameNum,framelen,inc,fs)
% ================= 计算分帧后每一帧对应的时间=====================
% ================= 输 入 ==================================
%frameNum : 总帧数
%framelen : 帧长
%inc : 帧移
%fs : 采样频率%
================== 输 出 ====================================
%frametime : 每帧的时间,即取这一帧数据中间位置的时间
frameTime=(((1:frameNum)-1)*inc+framelen/2)/fs;
检验工具包是否安装成功:
>> addpath(genpath('D:\MATLAB R2014a\toolbox\voicebox\voicebox'))
>> savepath
>> which activlev.m
如果结果为D:\MATLAB R2014a\toolbox\voicebox\voicebox\activlev.m即表示输出成功。
clear
[x,Fs]=wavread('E:\szyy.wav'); % 读入数据文件
x=x(:,1); % 双声道变单声道
wlen=200; inc=80; % 给出帧长和帧移
win=hanning(wlen); % 给出海宁窗
N=length(x); % 信号长度
X=enframe(x,win,inc)'; % 分帧
fn=size(X,2); % 求出帧数
time=(0:N-1)/Fs; % 计算出信号的时间刻度
for i=1 : fn
u=X(:,i); % 取出一帧
u2=u.*u; % 求出能量
En(i)=sum(u2); % 对一帧累加求和
end
subplot 211; plot(time,x,'k'); % 画出时间波形
title('语音波形');
ylabel('幅值'); xlabel(['时间/s' 10 '(a)']);
frameTime=frame2time(fn,wlen,inc,Fs); % 求出每帧对应的时间
subplot 212; plot(frameTime,En,'k') % 画出短时能量图
title('短时能量');
ylabel('幅值'); xlabel(['时间/s' 10 '(b)']);
矩形窗(窗长200帧)短时平均能量图如下:
矩形窗 窗长150帧
矩形窗 窗长100帧
矩形窗 窗长50帧
哈明窗 窗长1000帧
哈明窗 窗长200帧
哈明窗 窗长150帧
哈明窗 窗长100帧
哈明窗 窗长50帧
|
请发表评论