以三角波为例。首先编制计算周期三角波的C函数。要求:三角波参数与正弦函数相似,标准周期为 2 π 2\pi 2π,占空比 p p p(上升时间比周期)表示三角波上升下降段的比例, p = 0.5 p=0.5 p=0.5为上升下降对称的。在 [ 0 , 2 π × p ] [0, 2\pi \times p] [0,2π×p]上为上升沿,在 2 π × p , 2 π 2\pi \times p, 2\pi 2π×p,2π区间为下降沿。
公式:
上升沿: y = 2 p t − 1 y=\frac{2}{p}t-1 y=p2t−1
下降沿: y = − 2 2 π − p t + 2 π + p 2 π − p y=-\frac{2}{2\pi -p}t+\frac{2\pi +p}{2\pi -p} y=−2π−p2t+2π−p2π+p
只要写出在一个周期内的任意的函数表达式即可产生对应的波形。
三角波函数及测试代码:
//mytrianglewav.c
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.14159265
double trianglewav(t,p)
double t,p;
{
//三角波函数,p:0到1占空比
//trianglewav(t,p)的周期为2pi
//返回值在-1到+1间
double y;
//将t归化于0到2pi区间
if(t>=0)
t=(t/(2*PI)-(int)(t/(2*PI)))*2*PI;
else
t=2*PI+(t/(2*PI)-(int)(t/(2*PI)))*2*PI;
//检查占空比参数范围是否合法
if(p<0 | p>1){printf("fun trianglewav error: p<0 or p>1\n");exit(0);}
p=p*2*PI;
//当p为0或2*pi时的近似处理
p=(p-2*PI==0)?2*PI-1e-10:p;
p=(p==0)?1e-10:p;
if(t<p)
{
y=2*t/p-1;//计算上升沿
}
else
{
y=-2*t/(2*PI-p)+(2*PI+p)/(2*PI-p);//下降沿
}
return y;
}
main(int argc, char *argv[])
{
double y,t,p=0.5,f=1;
int i;
if(argc==3)
{
f=atof(argv[1]);
p=atof(argv[2]);
}
for(i=0; i<2*8000; i++)
{
t=-1+1.0/8000*i;
y=trianglewav(2*PI*f*t,p);
printf("%f\t%f\n",t,y);
}
}
编译执行(产生20Hz,占比0.5的三角波)
这里演示如何直接在gnuplot命令窗中执行编译并作图。(用“!”加gcc编译命令即可。)
gnuplot> !gcc mytrianglewav.c
gnuplot> plot [-0.1:0.1] [-2:2] "<a.exe 20 0.5" w lp pt 6 lc 3
gnuplot>
结果:
gnuplot> plot [-0.1:0.1] [-2:2] "<a.exe 20 1" w lp pt 6 lc 3
gnuplot> plot [-0.1:0.1] [-2:2] "<a.exe 20 0" w lp pt 6 lc 3
gnuplot> plot [-0.1:0.1] [-2:2] "<a.exe 10 0.2" w lp pt 6 lc 3