C语言及gnuplot任意波形产生及作图-以三角波为例

以三角波为例。首先编制计算周期三角波的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=p2t1

下降沿: 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

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值