以下是可能的实现代码:

% 读取wav文件
[y, Fs] = audioread('example.wav');

% 设置分析参数
frame_len = 0.03; % 帧长(秒)
frame_shift = 0.01; % 帧移(秒)
min_pitch = 50; % 基音周期最小值(Hz)
max_pitch = 300; % 基音周期最大值(Hz)

% 将时间单位转换为样点单位
frame_len_samp = round(frame_len * Fs);
frame_shift_samp = round(frame_shift * Fs);

% 分帧
num_frames = floor((length(y) - frame_len_samp) / frame_shift_samp) + 1;
frames = zeros(frame_len_samp, num_frames);
for i = 1:num_frames
    start_samp = (i - 1) * frame_shift_samp + 1;
    end_samp = start_samp + frame_len_samp - 1;
    frames(:, i) = y(start_samp:end_samp);
end

% 计算自相关
max_lag = round(Fs / min_pitch);
min_lag = round(Fs / max_pitch);
R = zeros(max_lag - min_lag + 1, num_frames);
for i = 1:num_frames
    frame = frames(:, i);
    acf = xcorr(frame, max_lag);
    R(:, i) = acf(end - max_lag + min_lag:end) / acf(max_lag + 1);
end

% 找到自相关峰值对应的周期和频率
[~, max_lag_idx] = max(R);
pitch_period_samp = max_lag_idx + min_lag - 1;
pitch_freq = Fs / pitch_period_samp;

% 绘制时域波形和自相关图
t = (0:length(y)-1) / Fs;
figure;
subplot(2, 1, 1);
plot(t, y);
title('时域波形');
xlabel('时间(秒)');
subplot(2, 1, 2);
plot((min_lag:max_lag) / Fs, R);
xlim([min_lag, max_lag] / Fs);
title('自相关');
xlabel('周期(秒)');
ylabel('相关系数');
hold on;
plot(pitch_period_samp / Fs, max(R), 'rx');

请注意,这只是一个示例实现,可能需要根据具体情况进行修改和调整。

使用matlab编程实现利用自相关求一段wav文件中某帧浊音的基音周期及基音频率并把时域波形图和自相关图画出来

原文地址: https://www.cveoy.top/t/topic/ba8w 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录