基本正弦波振荡器上的无毛刺频率变化

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 吗?你能给我指出理论以更好地理解这种现象吗? 是的。完美的!谢谢 我不明白你所说的“及时改变”是什么意思

以上是关于基本正弦波振荡器上的无毛刺频率变化的主要内容,如果未能解决你的问题,请参考以下文章

如何讲正弦波转化为方波?频率不变。

高频电子线路实验手册(全套实验报告册)

全套完结高频电子线路实验手册——全套实验报告册

电磁波常识

用FPGA产生正弦波

RC振荡电路