奈奎斯特频率限制 - 如何仅混合低于奈奎斯特限制的谐波
Nyquist Frequency Restriction - How to only mix harmonics that are below the Nyqvist Limit
我正在使用 getSampleRate() 辅助函数计算奈奎斯特极限并将其分配给临时局部变量。
我现在必须更新 class 中将谐波混合在一起的部分,以便只有频率低于奈奎斯特限制的谐波才包含在混合中。据说 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];
};
由于您提到您可以使用 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;
}
}
我正在使用 getSampleRate() 辅助函数计算奈奎斯特极限并将其分配给临时局部变量。
我现在必须更新 class 中将谐波混合在一起的部分,以便只有频率低于奈奎斯特限制的谐波才包含在混合中。据说 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];
};
由于您提到您可以使用 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;
}
}