天天看點

【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

繼續閱讀