Как создать прямоугольную волну с помощью C #? - PullRequest
1 голос
/ 17 августа 2011

Я хотел бы создать цифровой сигнал, который затем будет использоваться для реализации сигнала ASK (Amplitude Shift Keying).

Скажем, биты сообщения равны 10110, скорость передачи данных: 3,9 кГц и амплитуда 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 ]

3 голосов
/ 17 августа 2011

Самый простой способ, который я могу придумать, это установить y как знак синусоидальной волны, учитывая, что она равна нулю. Я не знаю, есть ли в C # тройной оператор, но что-то вроде этого может сработать:

y[k] = Math.Sin(freq * k)>=0?A:-1*A;
1 голос
/ 17 августа 2011

C #'s Блок итераторов поддержка приходит на ум:

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);
1 голос
/ 17 августа 2011

Math.Sin полезно для синусоидальной волны, но прямоугольная волна должна быть намного, намного проще (то есть сигнал «высокий» для периода, затем «низкий» для периода). Если у вас где-то есть Math.Sin, вы генерируете синусоидальную, а не прямоугольную волну. Принимая во внимание, что прямоугольная волна может быть сгенерирована с условием (есть x> y), и синусоидальная волна требует полной математической операции, она также намного более эффективна.

...