我想生成一个数字信号,然后用它来实现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);
答案 0 :(得分:3)
我能想到的最简单的方法是将y设置为正弦波的符号,并在等于零时进行补偿。我不知道C#是否具有三重运算符,但这样的事情可能会起作用:
y[k] = Math.Sin(freq * k)>=0?A:-1*A;
答案 1 :(得分:1)
Math.Sin
对正弦波很有用,但是方波应该更远,更简单(即信号在一段时间内“高”,然后在一段时间内“低”)。如果您在任何地方都有Math.Sin
,则会生成正弦波,而不是方波。记住,可以用条件(x> y)生成方波,并且正弦波需要完整的数学运算,它也更有效。
答案 2 :(得分:1)
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);