matlab 基音代码
时间: 2023-07-03 22:24:01 浏览: 138
基音频率计算含Matlab源码
5星 · 资源好评率100%
以下是 MATLAB 中计算基音的代码:
```matlab
% 读取音频文件
[x, Fs] = audioread('audio.wav');
% 提取基音
frameLen = 30; % 帧长,单位为毫秒
frameShift = 10; % 帧移,单位为毫秒
pitchMin = 50; % 基音最小值,单位为 Hz
pitchMax = 300; % 基音最大值,单位为 Hz
pitch = pitchTrack(x, Fs, frameLen, frameShift, pitchMin, pitchMax);
% 绘制基音频谱图
t = (1:length(pitch)) * frameShift / 1000;
plot(t, pitch);
xlabel('Time (s)');
ylabel('Pitch (Hz)');
title('Pitch Contour');
```
其中 `pitchTrack` 函数是计算基音的核心部分,下面是该函数的具体实现:
```matlab
function pitch = pitchTrack(x, Fs, frameLen, frameShift, pitchMin, pitchMax)
% x: 音频信号
% Fs: 采样率
% frameLen: 帧长,单位为毫秒
% frameShift: 帧移,单位为毫秒
% pitchMin: 基音最小值,单位为 Hz
% pitchMax: 基音最大值,单位为 Hz
% 将帧长和帧移从毫秒转换为样点数
frameLen = round(frameLen / 1000 * Fs);
frameShift = round(frameShift / 1000 * Fs);
% 计算自相关函数
r = xcorr(x, frameLen, 'coeff');
r = r(frameLen+1:end);
% 设置基音搜索范围
minLag = round(Fs / pitchMax);
maxLag = round(Fs / pitchMin);
% 初始化基音序列
pitch = zeros(1, length(x) / frameShift);
% 计算基音
for i = 1:length(pitch)
% 计算自相关函数在基音搜索范围内的峰值
[rmax, lmax] = max(r(minLag:maxLag));
lag = lmax + minLag - 1;
% 如果峰值小于阈值,则认为该帧无基音
if rmax < 0.4
pitch(i) = NaN;
else
pitch(i) = Fs / lag;
end
% 更新自相关函数,去除已搜索的基音周期
r(lag-minLag+1:lag+minLag-1) = 0;
% 移动帧
x = x(frameShift+1:end);
r = r(frameShift+1:end);
end
```
该函数基于自相关法计算基音,具体实现如下:
1. 将音频信号分帧,每帧长度为 `frameLen`,帧移为 `frameShift`。
2. 对每帧进行自相关计算,并在基音搜索范围内寻找自相关函数的最大峰值。
3. 如果最大峰值小于阈值,说明该帧无基音;否则,基音周期为自相关函数最大峰值对应的时滞,基音频率为采样率除以基音周期。
4. 更新自相关函数,去除已搜索的基音周期。
5. 移动帧,重复步骤 2 到步骤 4,直到计算完所有帧的基音。
阅读全文