gpt4 book ai didi

c++ - 根据特定数据计算锯齿波和三角波

转载 作者:搜寻专家 更新时间:2023-10-31 00:17:58 24 4
gpt4 key购买 nike

我需要计算三角形和锯齿波,但由于我的模型和我能够使用的数据,它有点复杂(但也许我只是感到困惑)。

我能够计算我的正弦波,但我并没有真正使用帧计数器。我所做的是,计算一个 theta_increment 变量,下次我需要计算样本时可以使用它。这是这样工作的:

float x = note.frequency / AppSettings::sampleRate;
float theta_increment = 2.0f * M_PI * x;
float value = 0;

if(waveType == SINE){
value = sin(note.theta) * fixedAmplitude;
}

现在我有了当前帧/样本的值,我将 theta_increment 存储在我的 note.theta 成员中,这样我就可以将它用于下一个样本:

note.theta += theta_increment;

我看了很多关于如何计算锯或三角形的例子,但我还是想不出来。 (我只有上面提到的数据可供使用)这是我最后一次尝试,但它没有用,给我带来了很多故障:

value = 1.0f - (2.0f * ((float)note.theta / (float)44100));

最佳答案

如果你有一个像这样生成你的值的循环:

for (size_t frame=0; frame!=n_frames; ++frame) {
float pos = fmod(frequency*frame/sample_rate,1.0);
value[frame] = xFunc(pos)*fixedAmplitude;
}

然后您可以将这些函数用于不同类型的波:

float sinFunc(float pos)
{
return sin(pos*2*M_PI);
}

float sawFunc(float pos)
{
return pos*2-1;
}

float triangleFunc(float pos)
{
return 1-fabs(pos-0.5)*4;
}

基本思想是您想要一个在每个循环中从 0.0 到 1.0 的值 (pos)。然后,您可以随意塑造它。

对于正弦波,sin() 函数可以完成这项工作,您只需乘以 2*PI 即可将 0.0 到 1.0 的范围转换为 0.0 到 2*PI 的范围。

对于锯齿波,您只需将 0.0 到 1.0 的范围转换为 -1.0 到 1.0 的范围。乘以二减一即可。

对于三角波,可以使用绝对值函数来引起方向的突变。首先,我们通过减去 -0.5 将 0.0 到 1.0 的范围映射到 -0.5 到 0.5 的范围。然后我们通过取绝对值将其制成0.5到0.0到0.5的形状。通过乘以 4,我们将其转换为 2.0 到 0.0 到 2.0 的形状。最后用 1 减去它,我们得到 -1.0 到 1.0 到 -1.0 的形状。

关于c++ - 根据特定数据计算锯齿波和三角波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com