【问题标题】:Converting a sine or triangle wave into a sawtooth wave将正弦波或三角波转换为锯齿波
【发布时间】:2016-02-10 13:39:37
【问题描述】:

我正在尝试在 C++ 中生成不同的波形。到目前为止,我管理了正弦波、三角波和方波,但我不知道如何生成锯齿波。

这就是我的正弦波的样子:

uint8_t sample = (amp * envelope * sin(2 * M_PI * phase)) + 128;

这就是三角波:

double sinevalue = sin(2 * M_PI * phase);
uint8_t sample = (envelope * 2 * amp) / M_PI * asin(sinevalue) + 128;

如何将其转换为锯齿波?

【问题讨论】:

  • 你为什么要计算一个正弦值然后取它的反正弦值?没有明显的原因,这似乎在计算上是奢侈的。
  • 我的意思是,你可以像这样计算锯齿波(直接从维基百科):y(x) = - (2 * amp)/pi * arctan(cot(x*pi/period))
  • @Logicrat arcsin(sin(x))x2Pi[-Pi/2,Pi/2] 中。所以这是有原因的,但你是对的,它试图做的计算太多了。
  • 搜索傅里叶级数和变换,从数学上讲这应该有助于mathworld.wolfram.com/SawtoothWave.htmlmathworld.wolfram.com/FourierSeriesSawtoothWave.html
  • 为什么不在整数上使用 y=Amplitude*(t%Tperiod) 这样简单的东西,或者在浮点数上使用 a=a/b; a=a-floor(a) 而不是 a=a%b ???或使用预先计算的表......为什么要转换正弦波?或者这应该是应该处理正弦波信号并将其转换为锯齿的滤波器?

标签: c++ math audio waveform wave


【解决方案1】:

您无法将正弦波逐个样本转换为锯齿波。那是因为正弦波在时间上是对称的:如果你反转时间,那么除了一些可能的相移之外,你会得到相同的波。对于 swatooth 波浪,时间反转必须与符号反转相结合,唯一的时间反转版本看起来会在质量上有所不同。

您需要一些额外的信息,例如当前位置的斜率。或者您需要访问原始参数值,在这种情况下,公式会非常简单:

uint8_t sample = (amp * envelope * (phase - floor(phase));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 2018-09-19
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多