您需要避免输出波形的不连续性(这些是您听到的咔嗒声)。最简单的方法是使用基于 LUT 的波形发生器 - 这适用于任何周期性波形(即不仅仅是纯正弦波)。通常,您使用一个定点相位累加器,该累加器为每个新样本增加一个与当前输出频率相对应的增量值。您可以根据需要安全地修改增量,并且波形仍然是连续的。
伪代码(用于一个输出样本):
const int LUT_SIZE;
const int LUT[LUT_SIZE]; // waveform lookup table (typically 2^N, N >= 8)
Fixed index; // current index into LUT (integer + fraction)
Fixed delta; // delta controls output frequency
output_value = LUT[(int)index];
// NB: for higher quality use the fractional part of index to interpolate
// between LUT[(int)index] and LUT[(int)index + 1], rather than just
// truncating the index and using LUT[(int)index] only. Depends on both
// LUT_SIZE and required output quality.
index = (index + delta) % LUT_SIZE;
注意:要计算
delta
给定的输出频率
f
和采样率
Fs
:
delta = FloatToFixed(LUT_SIZE * f / Fs);