我正在编写一个基本的声音实验室来围绕使用数字振荡器生成音频进行实验。
我的振荡器适用于固定频率。但是,在我的程序中,我有一个滑块来改变运行频率。然而,频率变化,每次切换频率时我都能听到一个小故障。这可能是由于突然的频率变化造成的。
我已经写了一个控制代码,让我的频率逐渐变化,直到达到所需的频率,但有些东西不能正常工作,我无法弄清楚是什么。
每次设置新频率时,我都会确定实际频率与新频率之间的差异。然后,我将这个差值除以44100这是我的采样率,以便有一秒钟。我正在使用秒来了解频率变化的进展。
我听到的是频率增加,但当达到目标频率时,可听频率似乎有所下降。这真的很尴尬,因为如果我输出正在发送到正弦波计算的频率值,一切都很好,没有生成意外的步骤。
这是振荡器类的代码。这个频率变化控制过程现在只是在增加频率:
Oscillator::Oscillator(int freq, int sr):
sampleIndex(0),
chaseTargetFrequency(false),
frequencyChanged(false)
{
currentFrequency=freq;
frequency=freq;
sampleRate=sr;
}
void Oscillator::process(unsigned char* out)
{
float t = qreal(sampleIndex % sampleRate) / sampleRate;
if (frequencyChanged)
{
frequency+=inc;
if (frequency>=currentFrequency)
{
frequencyChanged = false;
}
}
qreal x = 0;
// SINEWAVE
x = 0.5f * qSin(2.f * M_PI * frequency * t);
qint16 value = static_cast<qint16>(x * 32767);
qToLittleEndian<qint16>(value, out);
sampleIndex++;
}
void Oscillator::setFrequency(int value)
{
if (frequencyChanged)
return;
currentFrequency = value;
inc = (currentFrequency-frequency)/44000.f;
frequencyChanged = true;
}
是否有人知道为什么这不能按预期工作?在问题解释期间,我希望我的语言足够清晰。
提前致谢,
致以最诚挚的问候,
Nuno Santos
答案 0 :(得分:3)
故障是因为输出值瞬间变化,因为当您更改频率时,sin
的输入值会立即发生变化。
为避免这种情况,请确保振荡器连续相位。而不是sin(2.pi.f.t)
,而是sin(phi)
,其中phi += 2.pi.f.dt
(其中dt
是时间上的步骤变化)。