波形算法
1. 正弦波
根据DESMOS工具可将
y
=
a
s
i
n
(
θ
+
p
)
+
h
y = asin(\theta + p) +h
y=asin(θ+p)+h
当
a
=
1
,
p
=
π
,
h
=
0
a =1,p = \pi, h=0
a=1,p=π,h=0 时可以绘制出如下正弦波
因此根据上述公式可写出代码如下
#define PI 3.141592653
float sin_data[1024];
void sin_wave(float Amplitude, float Period, float Horizontal)
{
unsigned int i;
for(i = 0;i < 1024; i++)
{
sin_data[i] = Amplitude * sin( 2 * PI / Period * i + Horizontal );
}
}
2. 三角波
根据DESMOS工具可将
y
=
a
sin
−
1
(
sin
(
θ
+
p
)
)
π
2
+
h
y\ =\ \frac{a\ \ \sin^{-1}\left(\sin\left(\theta\ +\ p\right)\ \right)}{\frac{\pi}{2}}\ +h
y = 2πa sin−1(sin(θ + p) ) +h
当
a
=
1
,
p
=
π
,
h
=
0
a =1,p = \pi, h=0
a=1,p=π,h=0 时可以绘制出如下三角波
因此根据上述公式可写出代码如下
#define PI 3.141592653
float triangle_data[1024];
void triangle_wave(float Amplitude, float Period, float Horizontal)
{
unsigned int i;
for(i = 0;i < 1024; i++)
{
triangle_data[i] = Amplitude * asin(sin( 2 * PI / Period * i + Horizontal )) / PI * 2;
}
}
3. 梯形波
可以根据三角波进行一个幅值判断,如果大于幅值最大值的x%后直接幅值为 幅值最大值。
因此可以简单的更改triangle_wave函数为如下:
#define PI 3.141592653
float trapezoid_data[1024];
void trapezoid_wava(float Amplitude, float Period, float Horizontal)
{
unsigned int i;
float y;
for(i = 0;i < 1024; i++)
{
trapezoid_data[i] = Amplitude * asin(sin( 2 * PI / Period * i + Horizontal ));
if( trapezoid_data[i] >= Amplitude)
trapezoid_data[i] = Amplitude;
if( trapezoid_data[i] <= -Amplitude)
trapezoid_data[i] = Amplitude;
}
}
4.方波
方波就很简单了,直接对sin函数出来的数据做正负判断,正就等于幅值最大值,负就等于幅值最大值的负数。
#define PI 3.141592653
float square_data[1024];
void square_wave(float Amplitude, float Period, float Horizontal)
{
unsigned int i;
for(i = 0;i < 1024; i++)
{
square_data[i] = Amplitude * sin( 2 * PI / Period * i + Horizontal );
}
if( square_data[i] > 0)
square_data[i] = Amplitude;
else if(square_data[i] < 0)
square_data[i] = -Amplitude;
}