如何使用C#生成方波?

时间:2011-08-17 10:10:42

标签: c# signal-processing

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

假设消息位为10110,数据速率为:3.9 Khz&幅度A。

生成Square信号(数字)的最佳方法是什么。

我尝试了以下代码,但结果并不理想。

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);

3 个答案:

答案 0 :(得分:3)

我能想到的最简单的方法是将y设置为正弦波的符号,并在等于零时进行补偿。我不知道C#是否具有三重运算符,但这样的事情可能会起作用:

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

答案 1 :(得分:1)

Math.Sin对正弦波很有用,但是方波应该更远,更简单(即信号在一段时间内“高”,然后在一段时间内“低”)。如果您在任何地方都有Math.Sin,则会生成正弦波,而不是方波。记住,可以用条件(x> y)生成方波,并且正弦波需要完整的数学运算,它也更有效。

答案 2 :(得分:1)

我想到了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);