基于MATLAB的语音信号处理

基于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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值