我正在尝试生成一组点,当绘制为图形时,表示1个周期的正弦波。要求是:
代码:
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;
}
我正在生成并存储文件中的点。绘制这些点后,我得到以下图表。
但我只需要一个周期。我怎么能这样做?
答案 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;
}
输出: