如何使用c#生成方波

本文关键字:方波 何使用 | 更新日期: 2023-09-27 18:05:55

我想生成一个数字信号,然后用于实现ASK(幅度移位键控)信号。

假设消息位为10110,数据速率为3.9 Khz &振幅a .

产生正方形信号(数字)的最佳方法是什么?

我尝试了下面的代码,但是结果不是我想要的。

double[] x = new double[1000];
double[] y = new double[1000];
double freq = 3900.0;
for (int k = 0; k < y.Length; k++)
{
    x[k] = k;
    y[k] = (4 / Math.PI) * (((Math.Sin(((2 * k) - 1) * (2 * Math.PI * freq))) /   ((2 * k) - 1)));
}
// Plot Square Wave
plotSquare(x, y, Msg);

如何使用c#生成方波

我能想到的最简单的方法是设置y为正弦波的符号,允许它等于零。我不知道c#是否有三重操作符,但像这样的东西可能会起作用:

y[k] = Math.Sin(freq * k)>=0?A:-1*A;

Math.Sin对正正弦波很有用,但方波应该简单得多(即信号在一段时间内为"高",然后在一段时间内为"低")。如果你在任何地方有一个Math.Sin,你会产生一个正弦波,而不是方波。记住,方波可以在一个条件下生成(x>y),而正弦波需要一个完整的数学运算,它也要高效得多。

c#的Iterator Block支持:

IEnumerable<Tuple<double, double>> SquareWave(double freq, double lowAmp, double highAmp)
{
    for (var x = 0.0; true; x += 1.0)
    {
        var y = ((int)(x / freq) % 2) == 0 ? lowAmp : highAmp;
        yield return Tuple.Create(x, y);
    }
}

的用法如下:

foreach(var t in SquareWave(10, -5, 5).Take(30))
    Console.WriteLine("X: {0:0.0}/Y: {1:0.0}", t.Item1, t.Item2);