📄 form1.cs
字号:
{
FFT1[j] = 0;
}
for (j = 0; j < N; j++)
{
Base1[j] = 0;
}
for (j = 0; j < N; j++)
{
Base2[j] = 0;
}
g = this.CreateGraphics();
Pen mypen = new Pen(Color.Black, 3);
if (wave != 0)
{
SolidBrush blueBrush = new SolidBrush(Color.LightBlue);
SolidBrush whiteBrush = new SolidBrush(Color.White);
g.FillRectangle(whiteBrush, 10, 20, 400, 500);
g.FillRectangle(blueBrush, 10, 100 * (wave - 1) + 20, 400, 100);
}
x = 10;
y = 20;
for (i = 0; i < 20; i++)
{
g.DrawLine(mypen, x, y, x, y + 25);
g.DrawLine(mypen, x, y, x + 5, y);
y += 25;
}
x = 10;
y = 20;
for (j = 0; j < 5; j++)
{
for (i = 0; i < 16; i++)
{
g.DrawLine(mypen, x, y + 100, x + 25, y + 100);
g.DrawLine(mypen, x, y + 95, x, y + 100);
x += 25;
}
x = 10;
y += 100;
}
x = 10;
y = 20;
for (i = 0; i < 5; i++)
{
g.DrawLine(mypen, x, y, x + 10, y + 10);
g.DrawLine(mypen, x, y, x - 10, y + 10);
x += 400;
y += 100;
g.DrawLine(mypen, x, y, x - 10, y + 10);
g.DrawLine(mypen, x, y, x - 10, y - 10);
x -= 400;
} //绘制坐标
x = 10;
y = 20;
g = this.CreateGraphics();
Pen mypen1 = new Pen(Color.Green);
Pen mypen2 = new Pen(Color.Red);
Pen mypen3 = new Pen(Color.Yellow);
Pen mypen4 = new Pen(Color.Brown);
Pen mypen5 = new Pen(Color.Black);
double[] Base = new double[N];
for (i = 0; i < N; i++) //计算基带波 并以SamplingF进行抽取
{
Base[i] = BaseA1 * Math.Sin(2 * Math.PI * i * BaseF1 / SamplingF) +
BaseA2 * Math.Sin(2 * Math.PI * i * BaseF2 / SamplingF) +
BaseA3 * Math.Sin(2 * Math.PI * i * BaseF3 / SamplingF) +
BaseA4 * Math.Sin(2 * Math.PI * i * BaseF4 / SamplingF) +
BaseA5 * Math.Sin(2 * Math.PI * i * BaseF5 / SamplingF);
}
q = 70;
y = q;
for (i = 0; (i < N) && (i < 400); i++) //画出基带波形
{
x += 1;
p = y;
y = -(int)((120 * Base[i*4]) / 3) + 70;
g.DrawLine(mypen1, x, p, x + 1, y);
}
for (i = 0; i < N; i++) //算出已调波
{
Carry[i] = Math.Cos(2 * Math.PI * i * CarryF / SamplingF);
Mou[i] = Carry[i] * Base[i];
Mou1[i] = 0;
Mou2[i] = Mou[i];
}
n = 30;
x = 10;
q = 170; //开始处的Y坐标
y = -(int)(n*Mou[0]) + q;
for (i = 0; (i < N) && (i < 400); i++) //画出已调波
{
x += 1;
p = y;
y = -(int)((int)(n*Mou[i])) + q; //缩小倍数n
g.DrawLine(mypen2, x - 1, p, x, y);
}
for (i = 0; i < N; i++)
{
Mou[i] = Mou2[i];
Mou1[i] = 0;
}
fft(Mou, Mou1, N, c, FFT, FFT1, 1); //计算FFT
for (i = 0; i < N; i++)
{
FFT2[i] = FFT[i];
FFT3[i] = FFT1[i];
} //保存FFT结果 计算IFFT时会清空得到的FFT值
for (i = 0; i < N - 5; i++)
{
FFT[i] = FFT[i] + FFT[i + 1] + FFT[i + 2] + FFT[i + 3] + FFT[i + 4];
}
n = 3; //缩小的倍数
x = 10;
q = 270; //开始处的Y坐标
y = -(int)(FFT[0]/n) + q;
for (i = 0; (i < N) && (i < 400); i++) //画出FFT频域波形
{
x += 1;
p = y;
y = -(int)((int)(FFT[5 * i]) / n) + q;
g.DrawLine(mypen3, x - 1, p, x, y);
}
for (i = 0; i < N; i++)
{
FFT[i] = FFT2[i];
FFT1[i] = FFT3[i];
}
fft(FFT, FFT1, N, c, Base1, Base2, 0); //计算IFFT
m = 40; //缩小的倍数
x = 10;
q = 370; //开始的Y坐标
y = -(int)(Base1[0]/m) + q;
for (i = 0; (i < N) && (i < 400); i++) //画出IFFT波形
{
x += 1;
p = y;
y = -(int)((int)(Base1[i])/m) + q; //缩小倍数m
g.DrawLine(mypen4, x - 1, p, x, y);
}
for (i = 0; i < N; i++)
{
Mou[i] = Mou2[i];
Mou1[i] = 0;
}
Baoluo[0] = 0;
for (i = 1; i < N; i++)
{
Baoluo[i] = Mou[i] * Math.Cos(2 * Math.PI * i * CarryF / SamplingF);
}
fft(Baoluo, Mou2, N, c, FFT, FFT1, 1);
n = (int)(LowpassF*SamplingN/SamplingF); //消除的FFT点数
for (i = 0; i < N; i++)
{
if ((i > n ))
FFT[i] = 0;
else
FFT[i] = FFT[i];
FFT1[i] = 0;
}
fft(FFT, FFT1, N, c, Base1, Base2, 0); //计算IFFT
m = 15; //缩小的倍数
x = 10;
q = 470; //开始的Y坐标
y = -(int)(Base1[0] / m) + q;
for (i = 0; (i < N) && (i < 400); i++) //画出还原波形
{
x += 1;
p = y;
y = -(int)((Base1[i*4]) / m) + q ; //缩小倍数m
g.DrawLine(mypen5, x - 1, p, x, y);
}
g.Dispose();
}
private void timer2_Tick(object sender, EventArgs e)
{
ShowWave();
timer2.Enabled = false;
}
private void fft(double[] pr, double[] pi, int n, int k, double[] fr, double[] fi, int l) //L=0求FFT;L=1求IFFT。
{ //输入实部 输入虚部 点数 点数的次数 输出的实部 输出的虚部 FFT/IFFT
int it, m, is1, i, j, nv, l0;
double p, q, s, vr, vi, poddr, poddi;
for (it = 0; it <= n - 1; m = it++)
{
is1 = 0;
m = it;
for (i = 0; i <= k - 1; i++)
{
j = m / 2;
is1 = 2 * is1 + (m - 2 * j);
m = j;
}
fr[it] = pr[is1];
fi[it] = pi[is1];
}
pr[0] = 1.0;
pi[0] = 0.0;
p = 6.283185306 / n;
pr[1] = Math.Cos(p);
pi[1] = -Math.Sin(p);
if (l == 1)
pi[1] = -pi[1];
for (i = 2; i <= n - 1; i++)
{
p = pr[i - 1] * pr[1];
q = pi[i - 1] * pi[1];
s = (pr[i - 1] + pi[i - 1]) * (pr[1] + pi[1]);
pr[i] = p - q;
pi[i] = s - p - q;
}
for (it = 0; it <= n - 2; it += 2)
{
vr = fr[it];
vi = fi[it];
fr[it] = vr + fr[it + 1];
fi[it] = vi + fi[it + 1];
fr[it + 1] = vr - fr[it + 1];
fi[it + 1] = vi - fi[it + 1];
}
m = n / 2;
nv = 2;
for (l0 = k - 2; l0 >= 0; l0--)
{
m /= 2;
nv <<= 1;
for (it = 0; it <= (m - 1) * nv; it += nv)
for (j = 0; j <= (nv / 2) - 1; j++)
{
p = pr[m * j] * fr[it + j + nv / 2];
q = pi[m * j] * fi[it + j + nv / 2];
s = pr[m * j] + pi[m * j];
s *= (fr[it + j + nv / 2] + fi[it + j + nv / 2]);
poddr = p - q;
poddi = s - p - q;
fr[it + j + nv / 2] = fr[it + j] - poddr;
fi[it + j + nv / 2] = fi[it + j] - poddi;
fr[it + j] += poddr;
fi[it + j] += poddi;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -