FPGAのシミュレーションで使う信号用のデータは、その都度excelなどで作成していましたが、これから頻繁に必要になりそうなので、C#で作成しました。
複素信号と信号の重畳機能は、まだ実装していません。
データ生成をクリックすると、画面上に波形と実際の2進数のデータの一部が表示されるので、問題なければ書き出しをクリックすると、ファイルに書き出されます。 始まりと終わりのつなぎを考慮していないので、アドレスビット数を多めに設定してつかわないと、信号のつなぎ目では不連続になります。
ソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } double[] sindata1, cosdata1, sindata2, cosdata2; double freq1, freq2, samplerate; int magnitude, addcnt; string romtext = ""; private void textBox2_TextChanged(object sender, EventArgs e) { magnitude = (int)(Math.Pow(2, int.Parse(textBox2.Text)) / 2); dg.mag = magnitude; } private void textBox3_TextChanged(object sender, EventArgs e) { samplerate = double.Parse(textBox3.Text) * 1000000; } private void textBox4_TextChanged(object sender, EventArgs e) { freq1 = double.Parse(textBox4.Text) * 1000; //Hz } private void textBox5_TextChanged(object sender, EventArgs e) { freq2 = double.Parse(textBox5.Text) * 1000; //Hz } private void button2_Click(object sender, EventArgs e) { var fname = textBox7.Text; File.WriteAllText(@fname + ".txt", romtext); } private void textBox1_TextChanged(object sender, EventArgs e) { addcnt = (int)Math.Pow(2, int.Parse(textBox1.Text)); dg.add = addcnt; } bool dataready; DrawGraph dg; private void pictureBox1_Paint(object sender, PaintEventArgs e) { dg.DrawAxis(e.Graphics); if (dataready) dg.DrawData(e.Graphics, sindata1); } private void Form1_Load(object sender, EventArgs e) { freq1 = double.Parse(textBox4.Text) * 1000; //Hz freq2 = double.Parse(textBox5.Text) * 1000; //Hz magnitude = (int)(Math.Pow(2, int.Parse(textBox2.Text)) / 2); addcnt = (int)Math.Pow(2, int.Parse(textBox1.Text)); samplerate = double.Parse(textBox3.Text) * 1000000; dg = new DrawGraph(pictureBox1, addcnt, magnitude); dataready = false; } private void button1_Click(object sender, EventArgs e) { sindata1 = new double[addcnt]; cosdata1 = new double[addcnt]; sindata2 = new double[addcnt]; cosdata2 = new double[addcnt]; for(int i = 0; i < addcnt; i++) { sindata1[i] = magnitude * Math.Sin(i * 2.0 * Math.PI * freq1 / samplerate); cosdata1[i] = magnitude * Math.Cos(i * 2.0 * Math.PI * freq1 / samplerate); sindata2[i] = magnitude * Math.Sin(i * 2.0 * Math.PI * freq2 / samplerate); cosdata2[i] = magnitude * Math.Cos(i * 2.0 * Math.PI * freq2 / samplerate); } dataready = true; pictureBox1.Refresh(); if (!checkBox1.Checked & !checkBox2.Checked) { romtext = ""; for(int i = 0; i < addcnt; i++) { var mm = int.Parse(textBox2.Text); var buf = Convert.ToString((int)sindata1[i], 2).PadLeft(mm, '0'); romtext = romtext + buf.Substring(buf.Length - mm, mm) + "\r\n"; } textBox6.Text = romtext; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
class DrawGraph { private PictureBox picturebox_; private float x0_; //x軸原点 private float y0_; //y軸原点 private float y1_; //y軸1に対するピクセル値 private float width_; private float tick; private int _add, _mag; private Font myfont_ = new Font("MS UI Gothic", 10); private SolidBrush mysolidbrush_ = new SolidBrush(Color.Black); private const float x_offset = 10.0F; private const float y_offset = 10.0F; //コンストラクタ public DrawGraph(PictureBox myPictureBox, int add, int mag) { picturebox_ = myPictureBox; x0_ = picturebox_.Left; y0_ = picturebox_.ClientSize.Height - 1; y1_ = y0_ /(float)(1.2* mag * 2); width_ = picturebox_.ClientSize.Width - 1; tick = width_ / add; _add = add; _mag = mag; } public int add { get { return _add; } set { _add = value; tick = width_ / _add; } } public int mag { get { return _mag; } set { _mag = value; y1_ = y0_ / (float)(1.2 * _mag * 2); } } public void DrawAxis(Graphics gr) { DrawVerticalLines(gr, Pens.Black); DrawHolizontalLines(gr, Pens.Black); } private void DrawHolizontalLines(Graphics gr, Pen mypen) { float yn = y0_ / 10; for (int i = 0; i <= y0_; i += 1) gr.DrawLine(mypen, 0, y0_ - yn * i, width_, y0_ - yn * i); } private void DrawVerticalLines(Graphics gr, Pen mypen) { float xn = width_ / 10; for (int i = 0; i <= (int)width_; i += 1) gr.DrawLine(mypen, xn * i, 0, xn * i, y0_); } public void DrawData(Graphics gr, double[] gdata) { Pen mypen = new Pen(Color.Red); PointF oldPoint = new PointF(0, (float)(y0_ - y1_ * gdata[0] - y0_/2)); for (int i = 1; i < gdata.Length - 1; i++) { mypen.Color = Color.Red; PointF newPoint = new PointF(i * tick, (float)(y0_ - y1_ * gdata[i] - y0_/2)); gr.DrawLine(mypen, oldPoint, newPoint); oldPoint = newPoint; } } } |
周波数2のデータとか余弦波のデータなど生成していますが、複素信号や重畳の時に使う予定で、このバージョンでは使用していません。