我通过总结谐波来做一个简单的强力带限合成。我从维基百科复制了公式,但没有关于如何获得最高谐波数的信息。有人可以给我一个公式吗?
这就是我提出的直觉:
脉搏波:
numharmonics = samplerate / 2.0 / frequency;
float sample = dutycycle;
// Precomputing 2 * Pi * (phase - duty / 2).
// It is used inside cos() a lot.
float precompute1 = (phase - dutycycle / 2.0) * 2.0 * M_PI;
for (std::size_t i = 1; i <= numharmonics; ++i)
{
float harmonic = 2.0 / (i * M_PI) *
std::sin(M_PI * i * dutycycle) *
std::cos(i * precompute1);
sample += harmonic;
}
sample = sample * 2.0 - 1.0;
phase += phasedelta;
return sample;
三角波:
numharmonics = (samplerate / 2.0 / frequency - 1.0) / 2.0;
float sample = 0.0;
// Precomputing 2 * Pi * phase. It is used inside sin() a lot.
float precompute1 = 2.0 * M_PI * phase;
for (std::size_t i = 0; i <= numharmonics; ++i)
{
float harmonic = std::sin((2 * i + 1) * precompute1) /
std::pow((2 * i + 1), 2);
if ((i % 2) == 0)
{
sample += harmonic;
}
else
{
sample -= harmonic;
}
}
sample = sample * 8.0 / std::pow(M_PI, 2);
phase += phasedelta;
return sample;
锯齿波:
numharmonics = samplerate / 2.0 / frequency;
float sample = 0.0;
// Precomputing 2 * Pi * phase. It is used inside sin() a lot.
float precompute1 = 2.0 * M_PI * phase;
for (std::size_t i = 1; i <= numharmonics; ++i)
{
float harmonic = std::sin(precompute1 * i) / i;
if ((i % 2) == 1)
{
sample += harmonic;
}
else
{
sample -= harmonic;
}
}
sample = -1.0 / M_PI * sample;
phase += phasedelta;
return sample;