⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 基于windows mobile 6.0的滤波器 实现了 FFT 和IFFT 用C#语言实现
💻 CS
📖 第 1 页 / 共 2 页
字号:
            {
                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 + -