天天看点

【Harvest源码分析】GetF0CandidateContour函数

该函数,顾名思义,就是描绘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)
           

函数入参有:

  1. zero_crossings 不再赘述
  2. boundary_f0 每个band的频率
  3. f0_floor 最低频率
  4. f0_ceil 最高频率
  5. temporal_positions 位置信息,实际上是0到f0_length之间的毫秒数
  6. f0_length f0的sample数
  7. f0_candidate (出参)输出的f0轮廓

它的原理是这样,

通过zero_crossings中的四个维度,向上过零点,向下过零点,峰值,谷值,来分别做插值计算,算法仿自matlab的interp1.

每个维度都会通过插值的算法,构建出f0_lenght的波形

一下是第一个band频率的数值样例

【Harvest源码分析】GetF0CandidateContour函数

然后把四个波形合并(每个点取均值),得出f0在此band频率下的轮廓。

上一篇: NDIS

继续阅读