c ++中的正弦波生成

时间:2018-05-16 08:41:11

标签: c++ sin sine

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

  • 1个周期的正弦波
  • 下限= 29491
  • 上限= 36043
  • no of points = 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;
}

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

enter image description here

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

5 个答案:

答案 0 :(得分:2)

考虑sine wave

的公式
y(t) = A * sin(2 * PI * f * t + shift)
     

其中:

     

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

将是:

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

y[0:t)获得一个完整周期循环,其中t是完整周期(即波长)所需的时间或点数

答案 1 :(得分:2)

一个周期似乎需要100个样本,所以你可能需要这个:

...
#define _USE_MATH_DEFINES
#include <math.h>
...
#define NB_OF_SAMPLES 100
...
  double angle = 0.0;
  for (int i = 0; i < NB_OF_SAMPLES; i++)
  {
    outfile << int(3276 * sin(angle) + 32767) << "\n";
    angle += (2 * M_PI) / NB_OF_SAMPLES;
  }
...

或更好:

#define NB_OF_SAMPLES 100
#define OFFSET        3276
#define AMPLITUDE     32767

...
  double angle = 0.0;
  for (int i = 0; i < NB_OF_SAMPLES; i++)
  {
    outfile << int(AMPLITUDE * sin(angle) + OFFSET) << "\n";
    angle += (2 * M_PI) / NB_OF_SAMPLES;
  }
...

答案 2 :(得分: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)
}

如果您的编译器/库没有开箱即用的M_PI,那么请查看here以获取应该使其可用的标志。

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

答案 3 :(得分:0)

您需要将for循环更改为从0迭代到2(pi)。这是正弦波的一个周期。您可能还希望将循环计数器更改为double而不是整数,并将其增加0.1或其他值。 screenshot from WolframAlpha.com

答案 4 :(得分:0)

完整周期包含360度。需要的样品是100.
步长为3.6。我早些时候错过了这个。

int main()
{
    ofstream outfile;
    outfile.open("data.dat",ios::trunc | ios::out);
    for(int i=0;i<101;i++)
    {
        float rads = M_PI/180;
        outfile << (float)(3276*sin(3.6*i*rads)+32767) << endl;
    }
    outfile.close();
    return 0;
}

如果样本数为200,则步长为360/200 = 1.8

int main()
{
    ofstream outfile;
    outfile.open("data.dat",ios::trunc | ios::out);
    for(int i=0;i<201;i++)
    {
        float rads = M_PI/180;
        outfile << (float)(3276*sin(1.8*i*rads)+32767) << endl;
    }
    outfile.close();
    return 0;
}

输出:

enter image description here