matalb 代码 自相关函数基音周期检测
时间: 2023-11-24 09:09:03 浏览: 114
在 MATLAB 中,可以使用自相关函数来进行基音周期检测。以下是一个示例代码:
```matlab
% 读取音频文件
[x, Fs] = audioread('example.wav');
% 设置分析参数
frame_length = round(20 * 1e-3 * Fs); % 帧长为 20 毫秒
overlap = round(frame_length * 0.5); % 帧重叠为一半
% 对每一帧进行基音周期检测
for i = 1 : overlap : length(x)-frame_length
% 取一帧信号
frame = x(i:i+frame_length-1);
% 计算自相关函数
r = xcorr(frame);
% 取自相关函数的一半(因为自相关函数是对称的)
r = r(length(frame):end);
% 找到自相关函数的第一个极大值
[~, locs] = findpeaks(r);
if isempty(locs)
continue; % 没有极大值,继续下一帧
end
period = locs(1);
% 将周期转换为频率
f0 = Fs / period;
% 显示基音频率
disp(f0);
end
```
注意,这个代码只是一个简单的演示,实际应用中还需要对基音频率进行平滑、去除不合理的值等处理。
相关问题
Matlab 计算基音周期代码
以下是一个简单的 Matlab 代码示例,用于计算基音周期:
```matlab
% 输入音频文件
[y, fs] = audioread('audio_file.wav');
% 提取基频特征
[f0, t] = pitch(y, fs);
% 计算基音周期
p = 1./f0;
% 绘制基音周期随时间的变化曲线
plot(t, p);
xlabel('时间 (秒)');
ylabel('基音周期 (秒)');
```
在这个示例中,我们使用 `audioread` 函数读取音频文件,并使用 `pitch` 函数提取基频特征。然后,我们可以通过将基频值的倒数来计算基音周期。最后,我们使用 `plot` 函数绘制基音周期随时间的变化曲线。请注意,这只是一个简单的示例,实际应用中可能需要更复杂的算法和处理步骤。
倒谱法基音周期检测、共振峰检测代码matlab
倒谱法是一种常用的基音周期检测方法,可以借助MATLAB实现。下面提供一个简单的基音周期检测和共振峰检测的MATLAB代码示例,供参考。
```matlab
% 基音周期检测和共振峰检测
% 首先读取音频文件,使用matlab自带的audioread函数
[x, fs] = audioread('voice.wav');
% 设置分析参数
winlen = 512; % 窗口长度
overlap = 256; % 帧重叠长度
nfft = 1024; % FFT点数
preemph = 0.97; % 预加重系数
minf0 = 80; % 最小基频
maxf0 = 300; % 最大基频
voicedthresh = 0.4; % 有声门限
unvoicedthresh = 0.1; % 无声门限
% 对每一帧进行处理
frames = enframe(x, winlen, overlap); % 分帧
nframes = size(frames, 1); % 帧数
f0 = zeros(nframes, 1); % 存储基频
formants = zeros(nframes, 4); % 存储共振峰
for i = 1:nframes
frame = frames(i, :); % 取出一帧
frame = filter([1 -preemph], 1, frame); % 预加重
spec = abs(fft(frame, nfft)); % 傅里叶变换
spec = spec(1:nfft/2); % 取一半
logspec = log(spec); % 取对数
cepstrum = ifft(logspec); % 倒谱
cepstrum = cepstrum(1:nfft/2); % 取一半
cepstrum(1:minf0/fs*nfft) = 0; % 去掉基频以下的分量
cepstrum(maxf0/fs*nfft:end) = 0; % 去掉基频以上的分量
[~, locs] = findpeaks(cepstrum); % 找峰值
if ~isempty(locs)
f0(i) = fs/locs(1); % 基频为第一个峰的频率倒数
formants(i, :) = locs(2:5)*fs/nfft; % 共振峰为2~5个峰的频率
end
end
% 判断有声无声
voiced = f0 > voicedthresh*fs/winlen & f0 < maxf0;
unvoiced = f0 < unvoicedthresh*fs/winlen;
f0(unvoiced) = 0; % 无声部分基频设为0
% 绘制频谱、倒谱、基频、共振峰等
t = (0:nframes-1)*overlap/fs;
f = (0:nfft/2-1)/nfft*fs;
figure;
subplot(2, 2, 1);
imagesc(t, f, 20*log10(abs(spec)));
axis xy;
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('Spectrogram');
subplot(2, 2, 2);
imagesc(t, f, 20*log10(abs(cepstrum)));
axis xy;
xlabel('Time (s)');
ylabel('Quefrency');
title('Cepstrum');
subplot(2, 2, 3);
plot(t, f0, 'r');
axis([0 max(t) 0 maxf0]);
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('Pitch');
subplot(2, 2, 4);
plot(t, formants);
axis([0 max(t) 0 maxf0]);
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('Formants');
legend('F1', 'F2', 'F3', 'F4');
```
该代码读取声音文件`voice.wav`,对每一帧进行基音周期检测和共振峰检测,并将结果绘制成图形。其中,`enframe`是分帧函数,`findpeaks`是寻找峰值函数。可以根据需要自行调整参数,例如窗口长度、帧重叠长度、FFT点数等。
阅读全文