使用自相关函数来计算基音频率
时间: 2024-01-13 20:03:12 浏览: 167
除了使用MATLAB中的`pitch`函数来计算基音频率外,还可以使用自相关函数来计算基音频率。以下是一个简单的MATLAB代码实现:
```
% 读取音频文件
[y,Fs] = audioread('sample.wav');
% 定义参数
window_size = 0.02; % 窗口大小(秒)
overlap = 0.5; % 窗口重叠比例
% 计算基频
window = hamming(round(window_size*Fs));
noverlap = round(window_size*Fs*overlap);
frame_length = length(window);
frame_shift = frame_length - noverlap;
num_frames = floor((length(y)-frame_length)/frame_shift) + 1;
f0 = zeros(num_frames,1);
for i = 1:num_frames
frame = y((i-1)*frame_shift+1:(i-1)*frame_shift+frame_length);
r = xcorr(frame);
r = r(length(frame):end);
[~,locs] = findpeaks(r);
if ~isempty(locs)
f0(i) = Fs/(locs(1)-1);
end
end
% 绘制基频曲线
t = (frame_length/2:frame_shift:(frame_length/2+(num_frames-1)*frame_shift))/Fs;
plot(t,f0);
xlabel('时间(秒)');
ylabel('基频(Hz)');
```
其中,`xcorr`函数用于计算自相关函数。对于每个时间段,我们计算这个时间段的自相关函数,并找到第一个正峰值的位置。基频可以通过采样频率除以这个位置来计算。`findpeaks`函数用于找到峰值位置。该函数的输出包括峰值的位置和峰值的值,我们只需要使用位置信息即可。你可以将上述代码保存为一个.m文件,然后在MATLAB命令窗口中运行。输入的音频文件名为`sample.wav`,你需要将其替换为你自己的音频文件名。你可以通过修改`window_size`和`overlap`参数来调整窗口大小和重叠比例,以获得更好的结果。绘制的基频曲线展示了声音的音调变化,你可以通过观察曲线来了解声音的高低变化。
阅读全文