如何使用C#生成方波?

如何使用C#生成方波?,c#,signal-processing,C#,Signal Processing,我想生成一个数字信号,然后用于实现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

我想生成一个数字信号,然后用于实现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);
double[]x=新的double[1000];
双精度[]y=新双精度[1000];
双频=3900.0;
对于(int k=0;k
我能想到的最简单的方法是将y设为正弦波的符号,并考虑它等于零的情况。我不知道C#是否有三重运算符,但类似的方法可能会起作用:

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

我能想到的最简单的方法是将y设为正弦波的符号,并考虑它等于零的情况。我不知道C#是否有三重运算符,但类似的方法可能会起作用:

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

Math.Sin
对正弦波很有用,但方波应该简单得多(即信号在一段时间内为“高”,然后在一段时间内为“低”)。如果你在任何地方都有一个
Math.Sin
,你将产生一个正弦波,而不是方波。记住,方波可以通过一个条件(x>y)生成,而正弦波需要一个完整的数学运算,它的效率也要高得多

Math.Sin
适用于正弦波,但方波应简单得多(即信号在一段时间内为“高”,然后在一段时间内为“低”)。如果你在任何地方都有一个
Math.Sin
,你将产生一个正弦波,而不是方波。记住,方波可以通过一个条件(x>y)生成,而正弦波需要一个完整的数学运算,它的效率也要高得多

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


你已经试过什么了?Stack Overflow是一个讨论与编程相关的特定问题的网站。我尝试使用以下代码,但未能获得所需的输出。y[k]=(4/Math.PI)*(((Math.Sin(((2*k)-1)*(2*Math.PI*freq))/(2*k)-1));你已经试过什么了?Stack Overflow是一个讨论与编程相关的特定问题的网站。我尝试使用以下代码,但未能获得所需的输出。y[k]=(4/Math.PI)*(((Math.Sin(((2*k)-1)*(2*Math.PI*freq))/(2*k)-1));谢谢你的回复,我也尝试过使用你的代码,现在更好了,但是间隔的输出周期不一样&不同,我想生成特定于消息的代码。不同的输出周期几乎肯定会产生影响,因为您使用的是k的整数值。是否有任何方法可以消除此类混叠效果?通常,如果采样频率低于信号的频率,则在对模拟信号进行数字化时,始终会产生混叠效果。因此,在频率为3900Hz的示例中,您需要至少两倍于该频率的采样率:因此k需要在每次迭代中增加1/7800(假定k以秒为单位)。混叠指的是采样值,而不是时间。在这方面,由于样本值是
A
-A
,因此这里不出现别名。采样周期是整数,这不是问题。再次强调,别名不是这里的问题。谢谢你的回复,我也尝试过使用你的代码,现在更好了,但是间隔的输出周期不一样,不同了,我想生成特定于消息的代码。不同的输出周期几乎肯定会产生影响,因为您使用的是k的整数值。是否有任何方法可以消除此类混叠效果?通常,如果采样频率低于信号的频率,则在对模拟信号进行数字化时,始终会产生混叠效果。因此,在频率为3900Hz的示例中,您需要至少两倍于该频率的采样率:因此k需要在每次迭代中增加1/7800(假定k以秒为单位)。混叠指的是采样值,而不是时间。在这方面,由于样本值是
A
-A
,因此这里不出现别名。采样周期是整数,这不是问题。再次强调,别名不是这里的问题。非常感谢你,因为我是C语言的新手。你的代码对我来说看起来很复杂,你能告诉我有没有简单的方法来生成信号。好吧,我想最难的部分是(x/freq)%2部分。我想要一个表达式,它从0-1-0变为at-freq,2*freq,…-首先用x除以freq,然后应用(int),我得到[0..freq]的0,[freq..2*freq]的1,[2*freq..3*freq]的2,依此类推。然后我取这个整数模2,得到所需的0,1,0,1,…效果。通过将它与放大器相乘,我得到一个信号,从[0..freq]的0,从放大器得到[freq..2*freq)等等。剩下的是C#中的语法糖,要生成一个元组序列(第一个元素是x,第二个元素是y),如果你想要-amp/+amp,你可以乘法,只需在“y=2*y-amp”之间加上另一行,如果你想在其中编码一些消息,你可以把“(int)(x/freq)”作为你消息的索引,然后说“y=信息位[(整数)(x/频率)]*amp"-等等。希望这能帮上忙谢谢你给我一个清晰的解释,是的,我会尝试在我的项目中实现这段代码。到目前为止,我还没有遇到过不可数元组,所以我认为这会有点复杂。我需要花些时间学习,其余的都很清楚,再次感谢….!非常感谢你,因为我是C#你的代码的新手对我来说看起来很复杂,你能告诉我有没有简单的方法来产生信号。好的-我想最难的部分是(x/freq)%2-部分。我想要一个表达式,它从0-1-0变为at-freq,2*freq,…-首先用x除以freq,然后应用(int)得到0