该函数,顾名思义,就是描绘F0 Candidate的轮廓。
在GetFourZeroCrossingIntervals函数中,已经介绍了如何获取ZeroCrossings了。不清楚的可以再看一下我的那一篇文章。
void GetF0CandidateContour(const ZeroCrossings *zero_crossings,
double boundary_f0, double f0_floor, double f0_ceil,
const double *temporal_positions, int f0_length, double *f0_candidate)
函数入参有:
- zero_crossings 不再赘述
- boundary_f0 每个band的频率
- f0_floor 最低频率
- f0_ceil 最高频率
- temporal_positions 位置信息,实际上是0到f0_length之间的毫秒数
- f0_length f0的sample数
- f0_candidate (出参)输出的f0轮廓
它的原理是这样,
通过zero_crossings中的四个维度,向上过零点,向下过零点,峰值,谷值,来分别做插值计算,算法仿自matlab的interp1.
每个维度都会通过插值的算法,构建出f0_lenght的波形
一下是第一个band频率的数值样例
然后把四个波形合并(每个点取均值),得出f0在此band频率下的轮廓。