【问题标题】:Nyquist Frequency Restriction - How to only mix harmonics that are below the Nyqvist Limit奈奎斯特频率限制 - 如何仅混合低于奈奎斯特极限的谐波
【发布时间】:2016-03-24 23:21:36
【问题描述】:

我正在使用 getSampleRate() 辅助函数来计算奈奎斯特极限并将其分配给一个临时局部变量。

我现在必须更新类中将谐波混合在一起的部分,以便只有频率低于 Nyquist 限制的谐波包含在混合中。据说 getFrequency() 会找出它设置的频率,但在那之后我仍然不确定如何只包括这些频率。可能是一个 if 语句。

class SawWave
{
public:
void reset()
{

    for(int i=0; i<MAX_HARMONICS; i++)
    {
        harmonic[i].reset();

    }
}

void setFrequency(float frequency){

    for(int i=0; i < MAX_HARMONICS; i++)
    {
        harmonic[i].setFrequency(frequency * (i + 1));
    }
}

float tick()
{
    float nyquist = getSampleRate() * 0.5;   
    float sum = 0;
    int count;


    for (count = 0; count < MAX_HARMONICS; count++)
    {
        sum += (harmonic[count].tick()) * 1 / (count + 1);
    }
    return sum;
}

protected:

Sine harmonic[MAX_HARMONICS];
};

【问题讨论】:

  • 你想要一个低通滤波器?

标签: c++ audio signal-processing synthesis


【解决方案1】:

由于您提到您可以使用Sine::getFrequency() 访问各个谐波的频率,您只需将它们从sum 中累积的生成信号中排除:

for (count = 0; count < MAX_HARMONICS; count++)
{
    if (harmonic[count].getFrequency() < nyquist)
    {
        sum += (harmonic[count].tick()) * 1 / (count + 1);
    }
}

请注意,您也可以在找到不小于nyquist 的谐波后立即停止生成更多谐波,因为您是按频率递增的顺序存储谐波:

for (count = 0; count < MAX_HARMONICS; count++)
{
    if (harmonic[count].getFrequency() < nyquist)
    {
        sum += (harmonic[count].tick()) * 1 / (count + 1);
    }
    else
    {
        break;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多