% 读取语音信号
[speech, fs] = audioread(‘speech.wav’); % 读取语音信号文件
% 参数设置
frame_length = 20; % 帧长度(毫秒)
frame_shift = 10; % 帧移(毫秒)
order = 12; % LPC阶数
% 将时间表示转换为样本点表示
frame_length_samples = round(frame_length / 1000 * fs);
frame_shift_samples = round(frame_shift / 1000 * fs);
% 分帧
num_frames = ceil(length(speech) / frame_shift_samples);
frames = zeros(num_frames, frame_length_samples);
for i = 1:num_frames
start_index = (i - 1) * frame_shift_samples + 1;
end_index = min(start_index + frame_length_samples - 1, length(speech));
frames(i, 1:end_index-start_index+1) = speech(start_index:end_index);
end
% 计算倒谱
cepstrum = real(ifft(log(abs(fft(frames’, frame_length_samples))))); % 帧信号倒谱
% 计算复倒谱
complex_cepstrum = ifft(log(abs(fft(frames’, frame_length_samples)))); % 帧信号复倒谱
% 计算共振峰
resonances = zeros(num_frames, order+1);
for i = 1:num_frames
[A, ~] = lpc(frames(i, 😃, order);
roots_A = roots(A);
roots_A = roots_A(imag(roots_A) >= 0); % 只保留复平面右半边的根
frequencies = sort(atan2(imag(roots_A), real(roots_A)) * (fs / (2 * pi))); % 根据频率排序
resonances(i, 1:length(frequencies)) = frequencies;
end
% 计算激励特性
excitation = zeros(num_frames, frame_length_samples);
for i = 1:num_frames
[A, E] = lpc(frames(i, 😃, order);
excitation(i, 😃 = filter(A, sqrt(E), frames(i, 😃);
end
% 显示结果
figure;
subplot(2, 2, 1);
imagesc(cepstrum);
title(‘帧信号倒谱’);
xlabel(‘帧’);
ylabel(‘倒谱系数’);
subplot(2, 2, 2);
imagesc(real(complex_cepstrum));
title(‘帧信号复倒谱’);
xlabel(‘帧’);
ylabel(‘倒谱系数’);
subplot(2, 2, 3);
imagesc(resonances);
title(‘共振峰’);
xlabel(‘帧’);
ylabel(‘阶数’);
subplot(2, 2, 4);
imagesc(excitation);
title(‘激励特性’);
xlabel(‘帧’);
ylabel(‘样本’);
colormap(‘jet’);
colorbar;