C++ 基本正弦波振荡器的无故障频率变化
我正在写一个基本的声音实验室,用数字振荡器来做音频产生的实验 我的振荡器在固定频率下工作得很好。然而,在我的程序中,我有一个滑块来改变跑步的频率。频率变化,但是,我可以听到一个小故障,每次我切换频率。这可能是由于突然的频率变化 我已经写了一个控制代码,使我的频率逐渐改变,直到它达到所需的频率,但有些东西工作不正常,我不知道是什么 每次设置新频率时,我都会确定实际频率和新频率之间的差异。然后,我将差值除以44100,这是我的采样率,以得到一秒。我用一秒钟的时间来理解频率变化的过程 发生的情况是,我听到频率增加,但当它达到目标频率时,音频频率似乎下降了一点。这真的很尴尬,因为如果我输出发送到正弦波计算的频率值,一切都很好,没有生成意外的步长 这是振荡器类的代码。该频率变化控制过程目前仅适用于增加频率:C++ 基本正弦波振荡器的无故障频率变化,c++,c,audio,signal-processing,C++,C,Audio,Signal Processing,我正在写一个基本的声音实验室,用数字振荡器来做音频产生的实验 我的振荡器在固定频率下工作得很好。然而,在我的程序中,我有一个滑块来改变跑步的频率。频率变化,但是,我可以听到一个小故障,每次我切换频率。这可能是由于突然的频率变化 我已经写了一个控制代码,使我的频率逐渐改变,直到它达到所需的频率,但有些东西工作不正常,我不知道是什么 每次设置新频率时,我都会确定实际频率和新频率之间的差异。然后,我将差值除以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吗?你能给我指出理论来更好地理解这种现象吗?是的,是的。完美的谢谢我不明白你所说的“时间的逐步变化”是什么意思