Я использую вспомогательную функцию getSampleRate (), чтобы определить предел Найквиста и назначить его временной локальной переменной.
Теперь я должен обновить ту часть класса, которая смешивает гармоники вместе, чтобы в микшере были включены только гармоники с частотами ниже предела Найквиста. Предположительно, getFrequency () выяснит, на какую частоту он установлен, но после этого я все еще не уверен, как включить только эти частоты. Возможно, если заявление.
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;
}
}
Других решений пока нет …