如何使用C#生成方波?

发布于 2024-11-29 18:08:43 字数 458 浏览 0 评论 0原文

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

假设消息位为 10110,数据速率:3.9 Khz & 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);

I would like to generate a digital signal, which'll then be used to implement an ASK(Amplitude Shift Keying) Signal.

Let's say the message bits are 10110, data rate : 3.9 Khz & amplitude A.

What would be the best way to generate a Square signal(Digital).

I tried the following code, but the outcome is not a desired one.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

五里雾 2024-12-06 18:08:43

我能想到的最简单的方法是将 y 设置为正弦波的符号,并考虑到它为零的情况。我不知道 C# 是否有三重运算符,但这样的东西可能有效:

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

The easiest way I can think of is to set y to be sign of a sine wave, making allowances for when it equals zero. I don't know if C# has the triple-operator, but something like this might work:

y[k] = Math.Sin(freq * k)>=0?A:-1*A;
韬韬不绝 2024-12-06 18:08:43

Math.Sin 对于正弦波很有用,但方波应该简单得多(即信号在一个周期内为“高”,然后在一个周期内为“低”)。如果你在任何地方都有一个 Math.Sin ,你就会生成一个正弦波,而不是方波。请记住,方波可以在有条件(x>y)的情况下生成,而正弦波需要完整的数学运算,因此它的效率也高得多。

Math.Sin is useful for sine wave, but a square wave should be far, far simpler (i.e. signal is 'high' for a period, then 'low' for a period). If you have a Math.Sin anywhere, you are generate a sine wave, not a square wave. Bearing in mind a square wave can be generated with a condition (is x>y) and a sine wave needs a full mathematical operation, it's far more efficient, too.

找回味觉 2024-12-06 18:08:43

我想到了 C# 的 迭代器块 支持:

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

C#'s Iterator Block support comes to mind:

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

use like this:

foreach(var t in SquareWave(10, -5, 5).Take(30))
    Console.WriteLine("X: {0:0.0}/Y: {1:0.0}", t.Item1, t.Item2);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文