文章目录
基于MATLAB的语音信号处理
分帧
语音信号的两种分帧方法
% 功能:语音信号分帧处理
% 日期:2019,6,2
clear;
clc;
close all;
% ======================= input signal ==========================
y = [1,5,3,7,2,6,1];
N = length(y); % 数据长度
wlen = 4; % 帧长
overlap = 2; % 重叠
inc = wlen - overlap; % 帧移
fn = floor((N - wlen)/inc) + 1; % 帧数
% ============== 法一:通过循环来完成分帧数组 =====================
% yseg = zeros(wlen,fn); % 数据初始化,行数为帧长,列数为帧数
% for i = 1:fn
% startindex = (i-1)*inc +1;
% endindex = startindex + wlen-1;
% yseg(:,i) = y(startindex : endindex);
% end
% ============== 法二:分帧位置分配 ==============================
indf = ((0:(fn - 1))*inc)'; % 每一帧在数据y中开始位置的指针
inds = 1:wlen; % 每一帧的数据位置为1至wlen
% 将indf扩展乘fn*wlen的矩阵,每一列的数值都和原indf一样
indf_k = indf(:,ones(1,wlen)); % 相当于repmat(indf,1,wlen)
% 将inds扩展乘fn*wlen的矩阵,每一行的数值都和原inds一样
inds_k = inds (ones(fn,1), : ); % 相当于repmat(inds,fn,1)
yseg = y(indf_k + inds_k);
法二中:
indf_k =
0 0 0 0
2 2 2 2
inds_k =
1 2 3 4
1 2 3 4
indf_k + inds_k =
1 2 3 4
3 4 5 6
y(indf_k + inds_k) =
1 5 3 7
3 7 2 6
这里可以通过索引号以及形状,得到想要的结果。
根据分帧法二,将语音信号按帧长和帧移进行分帧
执行文件 exert
% 功能:语音信号分帧处理
% 日期:2019,6,2
clear;
clc;
close all;
% ======================= input signal ==========================
[y,fs] = audioread('a.wav');
N_win = fs/40; % 窗长
wlen = N_win; % 帧长,这里帧长等于窗长
inc = 800; % 帧移
win = boxcar(N_win); % 给定窗函数,或直接给定长度
% =========================== 调用函数 ==============================
y_data = enframe(y,win,inc); % 分帧后的数组(帧数×帧长)
% ============================设置观察时间参数
N = length(y);
time = (0:N - 1)/fs;
n = 20; % 观察第几帧信号
data_start = inc * (n-1); % 每一帧开始的数据索引
data_end = time_start + wlen-1; % 每一帧结束的数据索引
time_n = (data_start : data_end)./fs; % 第几帧信号对应的时间段
% ====================plot
subplot(2,1,1);plot(time,y) % 总信号
xlabel('时间/s','FontSize',12);
ylabel('语音信号','FontSize',15)
subplot(2,1,2);plot(time_n,y_data(n,:)) % 第n帧信号
xlabel('时间/s','FontSize',12);
str = num2str(n); % strnum()来将数字转换为字符类型
sum=strcat('语音信号第',str,'帧');
ylabel(sum,'FontSize',15)
调用分帧函数
function [y_data ] = enframe(x,win,inc)
% in:
% x:语音信号
% win:窗函数或者帧长
% inc:帧移
% out:
% 分帧后的数组(帧数×帧长)
% ===================================================
L = length(x(:)); % 数据的长度
nwin = length(win); % 取窗长, 数字的长度是1
if (nwin == 1) % 判断有无窗函数,若为1,表示没有窗函数
wlen = win; % 没有,帧长等于win
else
wlen = nwin; % 有窗函数,帧长等于窗长
end
if (nargin <3) % 如果只有两个参数,inc = 帧长
inc = len;
end
fn