用matlab编写一个对一段语音信号用倒谱法求基音周期的程序
时间: 2024-04-29 15:25:51 浏览: 17
以下是一个用matlab编写的对一段语音信号用倒谱法求基音周期的程序:
```matlab
% 读取语音信号
[x, fs] = audioread('speech.wav');
% 分帧
frame_len = 20; % 帧长为20ms
frame_shift = 10; % 帧移为10ms
frame_size = frame_len * fs / 1000;
frame_step = frame_shift * fs / 1000;
num_frames = fix((length(x) - frame_size) / frame_step) + 1;
frames = zeros(frame_size, num_frames);
for i = 1:num_frames
frames(:, i) = x((i-1)*frame_step+1:(i-1)*frame_step+frame_size);
end
% 预加重
pre_emphasis = [1, -0.97];
frames = filter(pre_emphasis, 1, frames);
% 求每一帧的基音周期
pitch = zeros(1, num_frames);
for i = 1:num_frames
% 求取自相关系数
r = xcorr(frames(:, i));
r = r(frame_size:end);
% 求倒谱
c = ifft(log(abs(fft(r))));
% 求基频
[~, locs] = findpeaks(c(1:fix(frame_size/2)));
if isempty(locs)
pitch(i) = 0;
else
pitch(i) = fs / locs(1);
end
end
% 绘制基音周期曲线
t = (frame_size/2:frame_step:length(x)-frame_size/2) / fs;
figure;
plot(t, pitch);
xlabel('Time (s)');
ylabel('Pitch (Hz)');
```
该程序首先读取语音信号,然后将其分帧,并对每一帧进行预加重处理。接下来,对于每一帧,首先求出自相关系数,然后求倒谱,最后从倒谱中找到基频对应的峰值位置,并将其转换为基音周期。最后,程序绘制了基音周期随时间的变化曲线。