⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 find_f0_yin.m

📁 Matsig is an object-oriented signal class library for MATLAB 6.5 and later. It implements a signal c
💻 M
字号:
function f0 = find_f0_yin(x)% FIND_F0_YIN  Find fundamental frequency using the YIN method%%    F0 = FIND_F0_YIN(X)%%    Find the fundamental frequency of signal X using the%    YIN method developed by de Cheveigne and Kawahara.% $Id: find_f0_yin.m 84 2005-08-22 09:47:16Z mairas $% range limits for f0f0_min = 60;f0_max = 2000;tau_min = floor(x.time.fs/f0_max);tau_max = ceil(x.time.fs/f0_min);% integration window sizeW = len(x)-tau_max;if W < 1    f0 = 0;    %warning('F0-YIN: Too short window');    return;end% threshold for step 4threshold = 0.1;% local context variablestau_min_local = 0.8;  % search range for the local estimatetau_max_local = 1.2;  % search range for the local estimater_local = 16;  % local context radius% initializationdn_array = zeros(r_local, tau_max);% initial energyE = sum(x.s.^2);% Step 2: Difference function% calculate the difference functiond = zeros(1, tau_max);for tau = 1:tau_max  d(tau) = sum((x.s(1:W) - x.s((1:W)+tau)).^2);end% Step 3: Cumulative mean normalized difference functiondn = d./(cumsum(d)./(1:tau_max));% Step 4: Absolute threshold% find the minima below the thresholddiff_dn = diff(dn);diff1 = diff_dn(tau_min-1:end-1);diff2 = diff_dn(tau_min:end);dn_range = dn(tau_min:end-1);minima = (diff1 <= 0) & (diff2 > 0) & (dn_range <= threshold);% get the first such minimum[val,idx] = max(minima);% if not found, use the global minimum insteadif isempty(val) || (val==0)  [min_val, min_idx] = min(dn_range);  min_idx = min_idx + tau_min - 1;else  min_idx = idx + tau_min - 1;  min_val = dn(min_idx);end% Step 5: Parabolic interpolation[min_idx_interp,min_val_interp] = interp_min(dn((min_idx-1):(min_idx+1)),min_idx);% Step 6: Best local estimate not practical for short frames, so omitted% final result:f0 = x.time.fs/min_idx_interp;function [x0,y0] = interp_min(y,min_idx)% get a minimum value by parabolically interpolating three points%A = [1 -1 1; 0 0 1; 1 1 1];%Ai = A^-1;Ai = [0.5 -1 0.5; -0.5 0 0.5; 0 1 0];a_ = [0.5 -1 0.5];b_ = [-0.5 0 0.5];a = Ai(1,:)*y';b = Ai(2,:)*y';c = Ai(3,:)*y';x0 = -b/(2*a);y0 = a*x0^2+b*x0+c;x0 = min_idx + x0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -