MATLAB 对语音信号进行分帧

首先定义一个分帧函数,便于调用。

%分帧函数
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('帧长'); 

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值