带限合成 - 获得谐波数量

时间:2017-10-18 11:44:47

标签: c++ audio signal-processing synthesizer

我通过总结谐波来做一个简单的强力带限合成。我从维基百科复制了公式,但没有关于如何获得最高谐波数的信息。有人可以给我一个公式吗?

这就是我提出的直觉:

脉搏波:

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;

0 个答案:

没有答案