Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基本正弦波振荡器的无故障频率变化_C++_C_Audio_Signal Processing - Fatal编程技术网

C++ 基本正弦波振荡器的无故障频率变化

C++ 基本正弦波振荡器的无故障频率变化,c++,c,audio,signal-processing,C++,C,Audio,Signal Processing,我正在写一个基本的声音实验室,用数字振荡器来做音频产生的实验 我的振荡器在固定频率下工作得很好。然而,在我的程序中,我有一个滑块来改变跑步的频率。频率变化,但是,我可以听到一个小故障,每次我切换频率。这可能是由于突然的频率变化 我已经写了一个控制代码,使我的频率逐渐改变,直到它达到所需的频率,但有些东西工作不正常,我不知道是什么 每次设置新频率时,我都会确定实际频率和新频率之间的差异。然后,我将差值除以44100,这是我的采样率,以得到一秒。我用一秒钟的时间来理解频率变化的过程 发生的情况是,我

我正在写一个基本的声音实验室,用数字振荡器来做音频产生的实验

我的振荡器在固定频率下工作得很好。然而,在我的程序中,我有一个滑块来改变跑步的频率。频率变化,但是,我可以听到一个小故障,每次我切换频率。这可能是由于突然的频率变化

我已经写了一个控制代码,使我的频率逐渐改变,直到它达到所需的频率,但有些东西工作不正常,我不知道是什么

每次设置新频率时,我都会确定实际频率和新频率之间的差异。然后,我将差值除以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;
}
振荡器:振荡器(intfreq,intsr): 样本指数(0), 跟踪目标频率(假), 频率更改(错误) { 电流频率=频率; 频率=频率; 采样器=sr; } void振荡器::进程(无符号字符*out) { 浮点数t=qreal(样本指数百分比采样器)/采样器; 如果(频率改变) { 频率+=有限公司; 如果(频率>=当前频率) { 频率改变=假; } } qrealx=0; //正弦波 x=0.5f*qSin(2.f*M_-PI*频率*t); qint16值=静态(x*32767); qtolittlendian(值,out); sampleIndex++; } 无效振荡器::设置频率(int值) { 如果(频率改变) 返回; 当前频率=值; inc=(当前频率)/44000.f; 频率改变=真; } 有没有人能提供线索来解释为什么这不能如预期的那样起作用?我希望在解释问题时我的语言足够清晰

提前感谢,

代我向你问好


努诺·桑托斯(Nuno Santos)

这个小故障是因为输出值瞬间改变,因为当你改变频率时,
sin
的输入值瞬间改变


要避免这种情况,请确保振荡器为连续相位。而不是
sin(2.pi.f.t)
,而是
sin(phi)
,其中
phi+=2.pi.f.dt
(其中
dt
是时间上的阶跃变化)。

小故障是因为输出值瞬间变化,因为
sin
的输入值在频率变化时瞬间变化


要避免这种情况,请确保振荡器为连续相位。而不是
sin(2.pi.f.t)
,而是
sin(phi)
,其中
phi+=2.pi.f.dt
(其中
dt
是时间上的阶跃变化)。

小故障是因为输出值瞬间变化,因为
sin
的输入值在频率变化时瞬间变化


要避免这种情况,请确保振荡器为连续相位。而不是
sin(2.pi.f.t)
,而是
sin(phi)
,其中
phi+=2.pi.f.dt
(其中
dt
是时间上的阶跃变化)。

小故障是因为输出值瞬间变化,因为
sin
的输入值在频率变化时瞬间变化


要避免这种情况,请确保振荡器为连续相位。不要使用
sin(2.pi.f.t)
,而是使用
sin(phi)
,其中
phi+=2.pi.f.dt
(其中
dt
是时间上的阶跃变化)。

谢谢您的快速回复。dt应该是1/44100吗?你能给我指出理论来更好地理解这种现象吗?是的,是的。完美的谢谢你的快速回复,我不明白你所说的“时间步长变化”是什么意思。dt应该是1/44100吗?你能给我指出理论来更好地理解这种现象吗?是的,是的。完美的谢谢你的快速回复,我不明白你所说的“时间步长变化”是什么意思。dt应该是1/44100吗?你能给我指出理论来更好地理解这种现象吗?是的,是的。完美的谢谢你的快速回复,我不明白你所说的“时间步长变化”是什么意思。dt应该是1/44100吗?你能给我指出理论来更好地理解这种现象吗?是的,是的。完美的谢谢我不明白你所说的“时间的逐步变化”是什么意思