基本正弦波振荡器上的无毛刺频率变化
Posted
技术标签:
【中文标题】基本正弦波振荡器上的无毛刺频率变化【英文标题】:Glitch free frequency change on basic sinewave oscillator 【发布时间】:2013-12-30 12:16:43 【问题描述】:我正在编写一个基本的声音实验室,以使用数字振荡器围绕音频生成进行实验。
我的振荡器非常适合固定频率。但是,在我的程序中,我有一个滑块可以在运行时更改频率。但是频率会发生变化,每次切换频率时我都能听到一个小故障。这可能是由于突然的频率变化。
我编写了一个控制代码,让我的频率逐渐变化,直到达到所需的频率,但有些东西不能正常工作,我不知道是什么。
每次设置新频率时,我都会确定实际频率与新频率之间的差异。然后,我将该差异除以 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;
有没有人知道为什么这没有按预期工作?我希望在问题解释过程中我的语言足够清晰。
提前致谢,
谨向您致以最诚挚的问候,
努诺桑托斯
【问题讨论】:
【参考方案1】:毛刺是因为输出值瞬间改变,因为sin
的输入值在你改变频率时瞬间改变。
为避免这种情况,请确保您的振荡器是连续相位。而不是sin(2.pi.f.t)
,而是sin(phi)
,其中phi += 2.pi.f.dt
(其中dt
是时间的阶跃变化)。
【讨论】:
感谢您的快速回复。 dt 应该是 1/44100 吗?你能给我指出理论以更好地理解这种现象吗? 是的。完美的!谢谢 我不明白你所说的“及时改变”是什么意思以上是关于基本正弦波振荡器上的无毛刺频率变化的主要内容,如果未能解决你的问题,请参考以下文章