本代码为MATLAB程序f11.m,主要用于实现语音信号的处理与分析,包括但不限于滤波、频谱分析等功能。
Matlab语音信号处理程序-f11.m可以对语音信号的单个字或词进行频率及过零率分析。
```matlab
clc
[filename, pathname] = uigetfile;
[x,Fs] = wavread;
% 幅度归一化到[-1, 1]
x = double(x);
x = x / max(abs(x));
% 常数设置
FrameLen = 240; % 每帧长度为240个采样点
FrameInc = 80; % 相邻两帧之间的重叠部分为80个采样点
amp1 = 10;
amp2 = 2;
zcr1 = 10;
zcr2 = 5;
maxsilence = 3; % 最大静默时间为6*10ms=30ms
minlen = 15; % 最小语音段长度为15*10ms=150ms
status = 0;
count = 0;
silence = 0;
% 计算过零率
tmp1 = enframe(x, FrameLen, FrameInc);
tmp2 = enframe(diff(tmp1), FrameLen, FrameInc);
signs = tmp2 < 0;
diffs = abs(tmp2) > 0.02;
zcr = sum(signs & diffs, 1); % 对每一帧计算过零率
% 计算短时能量
amp = sum(abs(x), FrameLen, FrameInc).^2;
% 调整能量门限
amp1 = min(amp) / 4;
amp2 = min(amp) / 8;
x1 = 0;
x2 = 0;
x3 = 0;
x4 = 0;
for n=1:length(x)
goto = 0;
switch status
case {0,1} % 状态为静默或可能开始语音段时
if amp(n) > amp1
x1 = max(amp);
status = 2;
silence = 0;
count = count + 1;
elseif (amp(n) > amp2 | zcr(n) > zcr2)
status = 1;
count = count + 1;
else
status = 0;
count = 0;
end
case 2 % 状态为语音段时
if (amp(n) > amp2 | zcr(n) > zcr2)
count = count + 1;
else
silence = silence + 1;
if silence < maxsilence
count = count + 1;
elseif count < minlen
status = 0;
silence = 0;
count = 0;
else
status = 3;
end
end
case 3 % 状态为结束时
break;
end
end
count = count - silence /2;
x2 = x1 + count -1;
subplot(4,1,1)
plot(x);
axis([-1 1]);
ylabel(信号幅度);
subplot(4,1,2)
plot(zcr);
axis([0 max(max(zcr))]);
ylabel(过零率);
line([0 length(zcr)], [zcr2 zcr2], Color, red);
line([0 length(zcr)], [zcr1 zcr1], Color, red);
subplot(4,1,3)
plot(amp);
axis([0 max(max(amp))]);
ylabel(能量);
line([0 length(amp)], [amp2 amp2], Color, red);
line([0 length(amp)], [amp1 amp1], Color, red);
```