該函數,顧名思義,就是描繪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頻率的數值樣例
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxkjNwMjN0kTM0EzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
然後把四個波形合并(每個點取均值),得出f0在此band頻率下的輪廓。