C ++中的正弦波生成

Pra*_*eep 5 c++ trigonometry

我正在尝试生成一组点,当绘制为图形时,这些点代表 1 个周期的正弦波。要求是:

  • 1个周期的正弦波
  • 下限 = 29491
  • 上限 = 36043
  • 点数 = 100
  • 振幅 = 3276
  • 零偏移 = 32767

代码 :

int main()
{
    ofstream outfile;
    outfile.open("data.dat",ios::trunc | ios::out);
    for(int i=0;i<100;i++)
    {
        outfile << int(3276*sin(i)+32767) << "\n";
    }
    outfile.close();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在生成并将点存储在文件中。绘制这些点后,我得到下图。

在此处输入图片说明

但我只需要一个周期。我怎样才能做到这一点?

Jos*_* D. 7

考虑到正弦波的公式:

y(t) = A * sin(2 * PI * f * t + shift)
Run Code Online (Sandbox Code Playgroud)

在哪里:

A = 幅度,函数与零的峰值偏差。
f = 普通频率,振荡次数(周期)
t = 时
移 = 相移

将是:

y[t] = AMPLITUDE * sin (2 * M_PI * 0.15 * t + 0) + ZERO_OFFSET;
                                   ^^^ f = 15 cycles / NUM_POINTS = 0.15 Hz
Run Code Online (Sandbox Code Playgroud)

要有一个完整的周期,从y[0:t)哪里开始循环,t它是一个完整的周期(即波长)所需的时间或点数


Pau*_*oyd 0

数学正弦函数std::sin以弧度为参数:

arg - 浮点或积分类型的表示角度(以弧度为单位)的值

如果你需要 1 个周期和 100 个点,那么知道一个周期中有 2pi 弧度,你需要类似的东西

double rads;
for(int i=1;i<=100;i++)
{
    rads = 2.0*M_PI*i/100;
    // your expression in terms of std::sin(rads)
}
Run Code Online (Sandbox Code Playgroud)

如果您的编译器/库没有开箱即用的 M_PI,那么请在此处查找使其可用的标志。

尚未涉及的一件事是您应该生成的确切间隔。如果您需要闭区间 [0,2pi],那么您将需要调整步长。我给出了一个半开区间 (0,2pi],@Michael Walz 给出了另一个半开区间 [0,2pi)。

  • 请注意,“M_PI”不是标准宏,并非所有库都定义它。 (2认同)