搜索
bottom↓
回复: 21

请问计算各次谐波的幅值计算原理。至于如何实现傅立叶积分计算更是不懂,望各位大侠指

[复制链接]

出0入0汤圆

发表于 2007-3-14 10:56:44 | 显示全部楼层 |阅读模式
原理不懂,下面程序看看也是很费劲的。



/* ************************************************************************

** 函 数 名:void ADCHD()

** 功能描述:单通道高频采样,数据处理,显示.

*************************************************************************** */

void ADCHD()

{

   long D,SHU;                                                      //数据.

   int n_x,k_x,i;                                                //循环参数.

   float Ur,Ui,Urn,Uin;                                       //数据处理中间变量.

   ADWORDS=ADCAN+7;                                             //确定MAX197控制字.

   for(ADD=0;ADD<64;ADD++)                                    //采样.

   {

      OUTADC(ADWORDS);                                          //送控制字.

      DELAY(0);                                                      //延时.

      DATA[0][ADD]=INADC();                                    //读取数据.

   }

   for(ADD=0;ADD<64;ADD++)                                    //显示波形.

   {

      D=(int)(40.0*DATA[0][ADD]/4096.0);               //取数据.

      LCDPIEX(ADD+64,40-D);                                    //显示.

   }

   for(n_x=0;n_x<5;n_x++)                                    //计算.

   {

      Urn=0.0;                                                      //实部.

      Uin=0.0;                                                      //虚部.

      for(k_x=0;k_x<32;k_x++)                                 //n_x次谐波.

      {

         D=DATA[0][k_x];                                          //取数据计算.

         Urn=Urn+D/409.6*cos((2*n_x+1)*(k_x+1)*0.196);

         Uin=Uin+D/409.6*sin((2*n_x+1)*(k_x+1)*0.196);

      }

      Ur=Urn/16.0;                                      //

      Ui=Uin/16.0;                                                //

      SHU=(long)(100*sqrt(Ur*Ur+Ui*Ui));

      UI[0][n_x]=SHU;                                             //第n_x次谐波幅值.

      UI[0][5]=SHU*SHU+UI[0][5];                            //            

   }   

   UI[0][5]=(long)sqrt(UI[0][5]);                        //总幅值.

   for(i=0;i<5;i++)                                             //

  {

     SHU=UI[0]*1000;                                       //

       SHU=SHU/(UI[0][5]);                                       //

       UP[0]=SHU;                                                //第i次谐波占有率.                                             

   }

   SHU=1000*(UI[0][5]-UI[0][0]);                           //

   UP[0][5]=SHU/UI[0][5];                                     //畸变率.

   LCDCLEAN(12,2,126,7);                                       //清除数据显示区.

   for(i=0;i<6;i++)

   {

      OUTNUM(UI[0],1,28,2+i);                           //显示幅值.

      OUTNUM(UP[0],3,56,2+i);                           //显示占有率.

   }   

   ADWORDS=ADCAN;                                                //还原控制字.

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2007-3-14 12:58:30 | 显示全部楼层
自己先顶一下

出0入0汤圆

 楼主| 发表于 2007-3-14 16:11:51 | 显示全部楼层
看样子懂的人还没来,自己再顶一下,不然就沉下去了。

出0入0汤圆

 楼主| 发表于 2007-3-15 08:57:11 | 显示全部楼层

出0入0汤圆

发表于 2007-3-15 13:12:39 | 显示全部楼层
不懂,帮顶 3楼的图片应该就是这个程序产生的吧

出0入0汤圆

 楼主| 发表于 2007-3-15 15:04:16 | 显示全部楼层
上的程序只能说能够计算类似的数值。要实现上图的功能还差的远。



我原来是在上面图片产品的公司工作,可惜没有具体从事相关工作。这个东西台湾人设计的。开发的是我们的副总。60多岁的老头,不过看上去还是很年轻,奇色无比。不知道这几年有没有收敛。

出0入0汤圆

 楼主| 发表于 2007-3-16 08:36:33 | 显示全部楼层
郁闷,都快沉到底了。不顶不行了。



高手们,快点来吧!

出0入0汤圆

发表于 2007-3-16 08:54:02 | 显示全部楼层
看看DSP的书吧,数字信号处理原理.当时学的时候就觉得很难...这个不是在论坛上一句二句说得清楚的.

出0入0汤圆

发表于 2007-3-16 09:17:08 | 显示全部楼层
需要读 信号与系统, 数字信号处理 这些书籍, 确实不是在论坛上能说清的.

出0入0汤圆

 楼主| 发表于 2007-3-17 08:22:03 | 显示全部楼层
说实话,信号处理的书我找了好几本,没有一本是写的深入浅出的。一看就让人头大。



我的几个朋友以前都学过《数字信号处理》,现在他们都说学过,现在忘了。也不知道是真的忘了还是根本就没有学会。

出0入0汤圆

 楼主| 发表于 2007-3-21 09:26:01 | 显示全部楼层
都沉到底了,看样子是真的没有人懂了。

出0入0汤圆

发表于 2007-3-21 10:32:48 | 显示全部楼层
请师傅:http://weblab.xjtu.edu.cn/instrument/first/index.php?action=elements&itsid=13

出0入0汤圆

发表于 2007-3-21 11:38:44 | 显示全部楼层
按照自己的理解,请指点



DFT第1个点应该就是直流分量,第32个点就是采样频率,中间频率32等分。

每个点对应的值,就是该频率下的幅度.



以下是关键部分

/*,作用是进行32点dft计算

*  主要是取出第1,3,5,7,9,次谐波的幅值

*  然后把幅值相加

*/

for(n_x=0;n_x<5;n_x++)                                 

   {  

      Urn=0.0;                                                      

      Uin=0.0;//虚部.  

      for(k_x=0;k_x<32;k_x++)//n_x次谐波.  

      {  

         D=DATA[0][k_x];//用到的模拟量x(t)的数值

         //下面求出X(f)的值

         //f(n)=((2*n_x+1)/32)*采样频率

         //E的指数上面是-inm*(2pi/n)=cos(nm*2pi/N)+sin(nm*2pi/N)

         //上面PI=3.14 N=32 n=k_x m=2*n_x+1

         Urn=Urn+D/409.6*cos((2*n_x+1)*(k_x+1)*0.196);  

         Uin=Uin+D/409.6*sin((2*n_x+1)*(k_x+1)*0.196);  

      }  

      Ur=Urn/16.0;   //信号重建,按照书上说的应该除采样总点数,不知道为什么要除2      

      Ui=Uin/16.0;                                                

      SHU=(long)(100*sqrt(Ur*Ur+Ui*Ui));    //把每次谐波的幅值相加

      UI[0][n_x]=SHU;  //第n_x次谐波幅值.  

      UI[0][5]=SHU*SHU+UI[0][5];                                       

   }

出0入0汤圆

 楼主| 发表于 2007-3-21 16:43:31 | 显示全部楼层
ymmer,终于遇到你这个高手。



这个堂子里,你算是牛人了。

出0入0汤圆

发表于 2007-3-21 19:30:26 | 显示全部楼层
FP32 FFT_THD(FP32 const *CosTab,

                                        FP32 const *SinTab) {



FP32        Kr, Ki, Krms;  //系数,实部,虚部

INT8U        i;



        Kr = ((FP32)sample_data[0] - (FP32)sample_data[32]) * CosTab[0];

        Ki = ((FP32)sample_data[16] - (FP32)sample_data[48]) * SinTab[16];

        for (i=1;i<16;i++)

        {

          Kr += ((FP32)sample_data - (FP32)sample_data[32-i] - (FP32)sample_data[32+i] +

                                                (FP32)sample_data[64 - i]) * CosTab;

          Ki += ((FP32)sample_data + (FP32)sample_data[32-i] - (FP32)sample_data[32+i] -

                                                (FP32)sample_data[64 - i]) * SinTab;

        }

        Krms = sqrt(Kr *Kr + Ki * Ki);

        return(Krms);

}



const float costab1[17]=

    {

      1.0, //0

      0.99518472, //1

      0.98078528, //2

      0.95694033, //3

      0.92387953, //4

      0.88192126, //5

      0.83146961, //6

      0.77301046, //7

      0.70710679, //8

      0.63439329, //9

      0.55557024, //10

      0.47139675, //11

      0.38268345, //12

      0.29028469, //13

      0.19509034, //14

      0.09801716, //15

      0.0 //16

      

     };



const float sintab1[17]=

    {

      0.0, //0

      0.09801714, //1

      0.19509032, //2

      0.29028467, //3

      0.38268343, //4

      0.47139673, //5

      0.55557023, //6

      0.63439328, //7

      0.70710678, //8

      0.77301045, //9

      0.83146961, //10

      0.88192126, //11

      0.92387953, //12

      0.95694033, //13

      0.98078528, //14

      0.99518472, //15

      1.0 //16

     };



const float costab3[17]=

      {

        1.0,

        0.95694034,   //1

        0.83146961,   //2

        0.63439328,   //3

        0.38268343,    //4

        0.09801714,  //5

        -0.19509032,  //6

        -0.47139673,  //7

        -0.70710678,  //8

        -0.88192126,  //9

        -0.98078528,  //10

        -0.99518472,  //11

        -0.92387953,  //12

        -0.77301045,  //13

        -0.55557023,  //14

        -0.29028467,  //15

         0.0                                  //16

       };

const float sintab3[17]=

      {

        0.0,   //0

        0.29028468,   //1

        0.55557023,   //2

        0.77301045,   //3

        0.92387953,   //4

        0.99518473,   //5

        0.98078528,   //6

        0.88192126,   //7

        0.70710678,   //8

        0.47139674,   //9

        0.19509032,   //10

        -0.09801710,   //11

        -0.38268340,   //12

        -0.63439330,   //13

        -0.83146961,   //14

        -0.95694034,   //15

        -1.0    //16

       };



const float costab5[17]=

      {

        1.0,   //0

        0.88192126,   //1

        0.555568324,  //2

        0.09801714,   //3

        -0.38268343,   //4

        -0.77301045,   //5

        -0.98078528,   //6

        -0.95694033,   //7

        -0.70710678,   //8

        -0.29028468,   //9

        0.195090322,   //10

        0.634393284,   //11

        0.923879532,   //12

        0.995184726,   //13

        0.831469612,   //14

        0.471396737,   //15

        0.0    //16

       };

const float sintab5[17]=

      {

        0.0,   //0

        0.47139674,   //1

        0.83146961,   //2

        0.99518473,   //3

        0.92387953,   //4

        0.63439328,   //5

        0.19509032,   //6

        -0.29028468,   //7

        -0.70710678,   //8

        -0.95694034,   //9

        -0.98078528,   //10

        -0.77301045,   //11

        -0.38268343,   //12

        0.098017140,   //13

        0.555570233,   //14

        0.881921264,   //15

        1.0    //16

       };



const float costab7[17]=

      {

        1.0,   //0

        0.77301045,   //1

        0.19509032,   //2

        -0.47139674,   //3

        -0.92387953,   //4

        -0.95694034,   //5

        -0.55557023,   //6

        0.098017140,   //7

        0.707106781,   //8

        0.995184727,   //9

        0.831469612,   //10

        0.290284677,   //11

        -0.382683430,   //12

        -0.881921264,   //13

        -0.980785280,   //14

        -0.634393284,   //15

        0.0    //16

       };

const float sintab7[17]=

      {

        0.0,   //0

        0.63439328,   //1

        0.98078528,   //2

        0.88192126,   //3

        0.38268343,   //4

        -0.29028468,   //5

        -0.83146961,   //6

        -0.99518473,   //7

        -0.70710678,   //8

        -0.09801714,   //9

        0.55557023,   //10

        0.95694034,   //11

        0.92387953,   //12

        0.47139674,   //13

        -0.19509030,   //14

        -0.77301045,   //15

        -1.0    //16

       };

//9

const float costab9[17]=

      {

        1.0,   //0

        0.63439328,   //1

        -0.19509032,   //2

        -0.88192126,   //3

        -0.92387953,   //4

        -0.29028468,   //5

        0.55557023,   //6

        0.99518473,   //7

        0.70710678,   //8

        -0.09801714,   //9

        -0.83146961,   //10

        -0.95694034,   //11

        -0.38268343,   //12

        0.47139674,   //13

        0.98078528,   //14

        0.77301045,   //15

        0.0    //16

       };

const float sintab9[17]=

      {

        0.0,   //0

        0.77301045,   //1

        0.98078528,   //2

        0.47139674,   //3

        -0.38268343,   //4

        -0.95694034,   //5

        -0.83146961,   //6

        -0.09801714,   //7

        0.70710678,   //8

        0.99518473,   //9

        0.55557023,   //10

        -0.29028468,   //11

        -0.92387953,   //12

        -0.88192126,   //13

        -0.19509032,   //14

        0.63439328,   //15

        1.0    //16

       };

//11

const float costab11[17]=

      {

        1.0,   //0

        0.47139674,   //1

        -0.5555702,   //2

        -0.99518473,   //3

        -0.38268343,   //4

        0.63439328,   //5

        0.98078528,   //6

        0.29028467,   //7

        -0.70710678,   //8

        -0.95694033,   //9

        -0.19509032,   //10

        0.77301045,   //11

        0.92387953,   //12

        0.09801714,   //13

        -0.83146961,   //14

        -0.88192126,   //15

         0.0   //16

       };

const float sintab11[17]=

      {

        0.0,   //0

        0.88192126,   //1

        0.83146961,   //2

        -0.09801714,   //3

        -0.92387953,   //4

        -0.77301045,   //5

        0.19509032,   //6

        0.95694034,   //7

        0.70710678,   //8

        -0.29028468,   //9

        -0.98078528,   //10

        -0.63439328,   //11

        0.38268343,   //12

        0.99518473,   //13

        0.55557023,   //14

        -0.47139674,   //15

        -1.0    //16

       };

//13

const float  costab13[17]=

      {

        1.0,   //0

        0.29028468,   //1

        -0.83146961,   //2

        -0.77301045,   //3

        0.38268343,   //4

        0.99518472,   //5

        0.19509032,   //6

        -0.88192126,   //7

        -0.70710678,   //8

        0.47139674,   //9

        0.98078528,   //10

        0.09801714,   //11

        -0.92387953,   //12

        -0.63439328,   //13

        0.55557023,   //14

        0.95694033,   //15

        0.0    //16

       };

const float sintab13[17]=

      {

        0.0,   //0

        0.95694034,   //1

        0.55557023,   //2

        -0.63439328,   //3

        -0.92387953,   //4

        0.09801714,   //5

        0.98078528,   //6

        0.47139673,   //7

        -0.70710678,   //8

        -0.88192126,   //9

        0.19509032,   //10

        0.99518473,   //11

        0.38268343,   //12

        -0.77301045,   //13

        -0.83146961,   //14

        0.29028468,   //15

        1.0    //16

       };

//15

const float   costab15[17]=

      {

        1.0,   //0

        0.09801714,   //1

        -0.98078528,   //2

        -0.29028468,   //3

        0.92387953,   //4

        0.47139674,   //5

        -0.83146961,   //6

        -0.63439328,   //7

        0.70710678,   //8

        0.77301045,   //9

        -0.55557023,   //10

        -0.88192126,   //11

        0.38268343,   //12

        0.95694034,   //13

        -0.19509032,   //14

        -0.99518473,   //15

        0.0    //16

       };

const float   sintab15[17]=

      {

        0.0,   //0

        0.99518473,   //1

        0.19509032,   //2

        -0.95694034,   //3

        -0.38268343,   //4

        0.88192126,   //5

        0.55557023,   //6

        -0.77301045,   //7

        -0.70710678,   //8

        0.63439328,   //9

        0.83146961,   //10

        -0.47139674,   //11

        -0.92387953,   //12

        0.29028468,   //13

        0.98078528,   //14

        -0.09801714,   //15

        -1.0    //16

       };

出0入0汤圆

发表于 2007-3-21 19:32:17 | 显示全部楼层
void FFTdata(void) {



FP32        FFTx[8];

INT8U        i;



        FFTx[0] = FFT_THD(costab1, sintab1);

       

        FFTx[1] = FFT_THD(costab3, sintab3);

        Hr[samplechannel_cnt][0] = (INT16U)((FFTx[1] / FFTx[0]) * 1000);

       

        FFTx[2] = FFT_THD(costab5,sintab5);

        Hr[samplechannel_cnt][1] = (INT16U)((FFTx[2] / FFTx[0]) * 1000);

       

        FFTx[3] = FFT_THD(costab7, sintab7);

        Hr[samplechannel_cnt][2] = (INT16U)((FFTx[3] / FFTx[0]) * 1000);

       

        FFTx[4] = FFT_THD(costab9, sintab9);

        Hr[samplechannel_cnt][3] = (INT16U)((FFTx[4] / FFTx[0]) * 1000);

       

        FFTx[5] = FFT_THD(costab11, sintab11);

        Hr[samplechannel_cnt][4] = (INT16U)((FFTx[5] / FFTx[0]) * 1000);

       

        FFTx[6] = FFT_THD(costab13, sintab13);

        Hr[samplechannel_cnt][5] = (INT16U)((FFTx[6] / FFTx[0]) * 1000);

       

        FFTx[7] = FFT_THD(costab15, sintab15);

        Hr[samplechannel_cnt][6] = (INT16U)((FFTx[7] / FFTx[0]) * 1000);

       

        FFTx[0] = 0x00;

        for(i=0;i<7;i++) FFTx[0] += ((FP32)(Hr[samplechannel_cnt]) * (FP32)(Hr[samplechannel_cnt]));

        Hr[samplechannel_cnt][7] = sqrt(FFTx[0]);

}

出0入0汤圆

 楼主| 发表于 2007-3-22 12:27:19 | 显示全部楼层
14楼的牛人都来了啊,一个字:“强”!

出0入0汤圆

发表于 2007-3-22 12:39:34 | 显示全部楼层
帮顶,有空看看

出0入0汤圆

发表于 2009-2-24 10:42:08 | 显示全部楼层
呵呵,慢慢在理解一下

出0入0汤圆

发表于 2012-9-15 16:50:55 | 显示全部楼层
收藏了。

出0入0汤圆

发表于 2012-9-16 00:54:10 来自手机 | 显示全部楼层
好,经典!谢谢了

出0入0汤圆

发表于 2013-5-6 06:54:01 | 显示全部楼层
好,经典!谢谢了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表