MATLAB编程实现短时能量、短时平均幅度和短时过零率,参考测试语音为 C2.wav每个参数的函数定义格式为: funcvalue = funcname(x,win,inc) 其中 x 为语音信号,win 为窗函数或帧长,inc 为帧移,funevaluce 为[1,帧数]的向量。。
时间: 2023-06-13 22:02:47 浏览: 207
以下是短时能量、短时平均幅度和短时过零率的 MATLAB 代码实现:
```matlab
function energy = stEnergy(x, win, inc)
% 计算短时能量
% x: 语音信号
% win: 窗函数或帧长
% inc: 帧移
% energy: 短时能量向量
if length(win) == 1 % 如果 win 是标量,则表示帧长
win = hamming(win); % 使用汉明窗
end
n = length(x); % 语音信号长度
len = length(win); % 窗长
nframe = fix((n-len)/inc)+1; % 帧数
energy = zeros(1, nframe); % 初始化能量向量
for i = 1:nframe
indf = (i-1)*inc+1; % 当前帧起始位置
inde = indf+len-1; % 当前帧终止位置
frame = x(indf:inde).*win; % 取出当前帧并加窗
energy(i) = sum(frame.^2); % 计算当前帧的能量
end
```
```matlab
function amp = stAmp(x, win, inc)
% 计算短时平均幅度
% x: 语音信号
% win: 窗函数或帧长
% inc: 帧移
% amp: 短时平均幅度向量
if length(win) == 1 % 如果 win 是标量,则表示帧长
win = hamming(win); % 使用汉明窗
end
n = length(x); % 语音信号长度
len = length(win); % 窗长
nframe = fix((n-len)/inc)+1; % 帧数
amp = zeros(1, nframe); % 初始化平均幅度向量
for i = 1:nframe
indf = (i-1)*inc+1; % 当前帧起始位置
inde = indf+len-1; % 当前帧终止位置
frame = x(indf:inde).*win; % 取出当前帧并加窗
amp(i) = sum(abs(frame))/len; % 计算当前帧的平均幅度
end
```
```matlab
function zcr = stZcr(x, win, inc)
% 计算短时过零率
% x: 语音信号
% win: 窗函数或帧长
% inc: 帧移
% zcr: 短时过零率向量
if length(win) == 1 % 如果 win 是标量,则表示帧长
win = hamming(win); % 使用汉明窗
end
n = length(x); % 语音信号长度
len = length(win); % 窗长
nframe = fix((n-len)/inc)+1; % 帧数
zcr = zeros(1, nframe); % 初始化过零率向量
for i = 1:nframe
indf = (i-1)*inc+1; % 当前帧起始位置
inde = indf+len-1; % 当前帧终止位置
frame = x(indf:inde).*win; % 取出当前帧并加窗
zcr(i) = sum(abs(sign(frame(1:end-1))-sign(frame(2:end))))/(2*len); % 计算当前帧的过零率
end
```
使用以下代码即可对测试语音进行计算:
```matlab
[x, fs] = audioread('C2.wav'); % 读取测试语音
win = 256; % 窗长
inc = win/2; % 帧移
energy = stEnergy(x, win, inc); % 计算短时能量
amp = stAmp(x, win, inc); % 计算短时平均幅度
zcr = stZcr(x, win, inc); % 计算短时过零率
```