如何使用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);
我能想到的最简单的方法是设置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);