最近老师叫用c#实现几个波形图,由于从来没有做过类似的事情,所以很迷茫,老师给出一些建议之后大概有了一个方向。先将目标图放出
我的思路如下:
1.首先将给出的六个图像的函数写出,大概有两种方法,一是把可以写成分段函数的图像写成分段函数,高斯白噪声用正态分布的方法,二是用傅里叶三角函数表示。这里我使用第一种方法。
2.写一个方法,输入为x的起止值,输出位对应段波形。
3.写出函数后验证函数是否正确,在Windows form上面画出图形,若和给出图一致,则函数编写正确。
下面为大家贴出代码
首先创建一个winform程序,添加wavefunction类,在此类里面写出各波的实现函数。
//作者屁屁烫
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WaveForm1
{
public class waveFunction
{
//三角波一个周期波形函数,输入参数为上图对应参数
public static List> triangular(double Amplitude, double Offset, double Frequency, double Phase)
{
//设置x,y的列表来储存x,y的值。分为几段函数就设置几个列表
List x1 = new List();
List y1 = new List();
List x2 = new List();
List y2 = new List();
List x3 = new List();
List y3 = new List();
double T = (double)(1 / Frequency);//周期T
int num = 200;//一个周期取值200个点画线
//用for循环遍历将x,y的值存入列表
for (int i = 1; i < (num / 4) + 1; i++)
{
x1.Add((i * (T / num)) + Phase);
x3.Add((i * (T / num) + 3 * (T / 4)) + Phase);
y1.Add((double)((Amplitude / (T / 4)) * ((i * (T / 200))) + Offset));
y3.Add((double)(((4 * ((i * (T / 200) + 3 * (T / 4))) - 3 * T) / T * Amplitude) - Amplitude) + Offset);
}
for (int i = 1; i < (num / 2) + 1; i++)
{
x2.Add((i * (T / num) + T / 4) + Phase);
y2.Add((double)(((T /2- ((i * (T / 200) + T / 4))))*(Amplitude /(T /4)) + Offset));
}
//用中间变量将分段的函数列表中所有元素依次存入一个列表resX(Y)
List X = x1.Concat(x2).ToList();
List resX = X.Concat(x3).ToList();
List Y = y1.Concat(y2).ToList();
List resY = Y.Concat(y3).ToList();
//创建一个列表N,T存储预设值num(一个周期的取点数量),周期
List resN = new List();
List resT = new List();
resN.Add(num);
resT.Add(T);
//创建一个list的list列表,将四个列表添加到此列表中
List> RET = new List>();
RET.Add(resX);
RET.Add(resY);
RET.Add(resN);
RET.Add(resT);
//返回一个元素为list的list
return RET;
}
//直线函数,注释参见三角波函数
public static List> line(double Offset)
{
List y1 = new List();
List x1 = new List();
int num = 201;
double T = 10;
for (int i = 0; i < num; i++)
{
x1.Add(i * (T / 200));
y1.Add(Offset);
}
List resN = new List();
List resT = new List();
resN.Add(num);
resT.Add(T);
List> RET = new List>();
RET.Add(x1);
RET.Add(y1);
RET.Add(resN);
RET.Add(resT);
return RET;
}
//方波函数