【信号处理】基于matlab实现语音信号倒谱计算,帧信号倒谱 复倒谱 共振蜂 激励特性

% 读取语音信号
[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;

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值