帮我在这段代码中增加求基音频率的代码“% 实验要求三:倒谱法基音周期检测 clc; close all; clear all; wlen=3200; inc=800; % 分帧的帧长和帧移 T1=0.05; % 设置基音端点检测的参数 [x,fs]=audioread('C:\Users\DELL\Desktop\C4_2_y.wav'); % 读入wav文件 x=x-mean(x); % 消去直流分量 x=x/max(abs(x)); % 幅值归一化 [voiceseg,vosl,SF,Ef,period]=pitch_Ceps(x,wlen,inc,T1,fs); %基于倒谱法的基音周期检测 fn=length(SF); time = (0 : length(x)-1)/fs; % 计算时间坐标 frameTime = FrameTimeC(fn, wlen, inc, fs); % 计算各帧对应的时间坐标 % 作图 subplot 211, plot(time,x,'k'); title('语音信号') axis([0 max(time) -1 1]); ylabel('幅值'); subplot 212; plot(frameTime,period,'k'); xlim([0 max(time)]); title('倒谱法基音周期检测'); xlabel('时间/s'); ylabel('样点数'); for k=1 : vosl % 标出有话段 nx1=voiceseg(k).begin; nx2=voiceseg(k).end; nxl=voiceseg(k).duration; fprintf('%4d %4d %4d %4d\n',k,nx1,nx2,nxl); subplot 211 line([frameTime(nx1) frameTime(nx1)],[-1 1],'color','r','linestyle','-'); line([frameTime(nx2) frameTime(nx2)],[-1 1],'color','b','linestyle','--'); subplot 212 line([frameTime(nx1) frameTime(nx1)],[0 150],'color','r','linestyle','-'); line([frameTime(nx2) frameTime(nx2)],[0 150],'color','b','linestyle','--'); end”
时间: 2024-01-28 12:02:57 浏览: 203
在代码的最后一个 for 循环内部,可以增加以下代码来求取基音频率:
```matlab
% 求基音频率
for k = 1 : vosl
nx1 = voiceseg(k).begin;
nx2 = voiceseg(k).end;
x_seg = x((nx1-1)*inc+1 : (nx2-1)*inc+wlen); % 取出当前帧对应的语音信号
[r, ~] = xcorr(x_seg); % 自相关函数
r = r(wlen : end); % 取出正半轴部分
[pks, locs] = findpeaks(r); % 找到所有极大值点
[~, max_idx] = max(pks); % 取最大极大值点
p = locs(max_idx); % 基音周期
f0 = fs/p; % 基音频率
fprintf('第 %d 个音段的基音频率为 %f Hz\n', k, f0);
% 在图上显示基音周期
subplot(212)
hold on
line([frameTime(nx1) frameTime(nx1)], [0 150], 'color', 'r', 'linestyle', '-');
line([frameTime(nx2) frameTime(nx2)], [0 150], 'color', 'b', 'linestyle', '--');
plot(frameTime(nx1) + wlen/fs*p, f0, 'r*');
hold off
end
```
注意,在添加这段代码之前,需要在代码开头加上 `findpeaks` 函数所在的 Matlab 工具箱路径,即:
```matlab
addpath('C:\Program Files\MATLAB\R2021a\toolbox\signal\signal');
```
其中,`C:\Program Files\MATLAB\R2021a` 是 Matlab 的安装路径,根据自己的实际情况进行修改。
阅读全文