首先定义一个分帧函数,便于调用。
%分帧函数
function frameout=enframe(x,win,inc)
nx=length(x(:)); % 取数据长度
nwin=length(win); % 取窗长
if (nwin == 1) % 判断窗长是否为1,若为1,即表示没有设窗函数
len = win; % 是,帧长=win
else
len = nwin; % 否,帧长=窗长
end
if (nargin < 3) % 如果只有两个参数,设帧inc=帧长
inc = len;
end
nf = fix((nx-len+inc)/inc); % 计算帧数
frameout=zeros(nf,len); % 初始化
indf= inc*(0:(nf-1)).'; % 设置每帧在x中的位移量位置
inds = (1:len); % 每帧数据对应1:len
frameout(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:)); % 对数据分帧
if (nwin > 1) % 若参数中包括窗函数,把每帧乘以窗函数
w = win(:)'; % 把win转成行数据
frameout = frameout .* w(ones(nf,1),:); % 乘窗函数
end
在当前文件夹创建一个.m文件。注意文件名要与要调用的函数名一致。
信号分帧
%语音分帧显示
%语音分帧显示
clc;
clear all;
[x,Fs]=audioread('myvoice.wav'); % 读入数据文件
wlen=200; inc=100; % 给出帧长和帧移
N=length(x); % 信号长度
time=(0:N-1)/Fs; % 计算出信号的时间刻度
signal=enframe(x,wlen,inc)'; % 调用分帧函数
i=input('请输入起始帧号(i):');
tlabel=i;
subplot 411;
% 画出第一帧时间波形
%tlabel-1)*inc+1:(tlabel-1)*inc+wlen 为起始帧第一帧的取值范围
plot((tlabel-1)*inc+1:(tlabel-1)*inc+wlen,signal(:,tlabel),'b');
%固定每一帧的长度
axis tight
xlim([(i-1)*inc+1 (i+2)*inc+wlen])
title(['(a)当前波形帧号:', num2str(i)]);
ylabel('幅值'); xlabel('帧长');
tlabel=i+1;
subplot 412;
% 画出第二帧时间波形
%(tlabel-1)*inc+1:(tlabel-1)*inc+wlen 为起始帧第二帧的取值范围
plot((tlabel-1)*inc+1:(tlabel-1)*inc+wlen,signal(:,tlabel),'b');
%固定每一帧的长度
axis tight
xlim([(i-1)*inc+1 (i+2)*inc+wlen])
title(['(b)当前波形帧号:', num2str(i+1)]);
ylabel('幅值'); xlabel('帧长');
tlabel=i+2;
subplot 413;
% 画出第三帧时间波形
plot((tlabel-1)*inc+1:(tlabel-1)*inc+wlen,signal(:,tlabel),'b');
%固定每一帧的长度
axis tight
xlim([(i-1)*inc+1 (i+2)*inc+wlen])
title(['(c)当前波形帧号:', num2str(i+2)]);
ylabel('幅值'); xlabel('帧长');
tlabel=i+3;
subplot 414;
% 画出第四帧时间波形
plot((tlabel-1)*inc+1:(tlabel-1)*inc+wlen,signal(:,tlabel),'b');
%固定每一帧的长度
axis tight
xlim([(i-1)*inc+1 (i+2)*inc+wlen])
title(['(d)当前波形帧号:', num2str(i+3)]);
ylabel('幅值'); xlabel('帧长');
运行结果