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

📄 calcphase.lst

📁 在c8051f015单片机上实现最小二乘法曲线拟合算法
💻 LST
字号:
C51 COMPILER V7.50   CALCPHASE                                                             01/08/2008 15:08:11 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CALCPHASE
OBJECT MODULE PLACED IN CalcPhase.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CalcPhase.c BROWSE DEBUG OBJECTEXTEND TABS(2)

line level    source

   1          
   2          #include "CalcPhase.h"
   3          #include <math.h>
   4          
   5          #define PI 3.1415926532
   6          
   7          #define SAMPLE_NUMS 128   //采样数
   8          
   9          
  10          typedef struct //定义平差系数结构
  11          {
  12             float S_aa;
  13             float S_ab;
  14             float S_bb;
  15             float S_ll;
  16             float S_al;
  17             float S_bl;
  18          }AVG_EQU_COEFF;
  19          
  20          
  21          //-------------------------------平差函数--------------------------------------------------------
  22          //输入:dat[]--测量数据数组 *amp-->初始振幅    *phase==初始初相角
  23          //输出 *amp=平差后的振幅,*phase=平差后的初相角 
  24          static void AvgErr(float dat[],float *amp,float *phase)
  25          {
  26   1         UINT8 i,j;
  27   1         float XDATA_MEM ai,bi,li,temp,dA,dF;
  28   1         AVG_EQU_COEFF XDATA_MEM coeff;
  29   1      
  30   1         j=0;
  31   1         do
  32   1         {
  33   2            coeff.S_aa=0;
  34   2            coeff.S_ab=0;
  35   2            coeff.S_bb=0;
  36   2            coeff.S_ll=0;
  37   2            coeff.S_al=0;
  38   2            coeff.S_bl=0;
  39   2            for(i=0;i<SAMPLE_NUMS;i++)
  40   2            {
  41   3                temp=*phase+(float)PI*i*13/64;
  42   3                ai=sin(temp);
  43   3                bi=(*amp)*cos(temp);
  44   3                li=(*amp)*ai-dat[i];
  45   3      
  46   3                coeff.S_aa+=ai*ai;
  47   3                coeff.S_ab+=ai*bi;
  48   3                coeff.S_bb+=bi*bi;
  49   3                coeff.S_ll+=li*li;                                           
  50   3                coeff.S_al+=ai*li;
  51   3                coeff.S_bl+=bi*li;
  52   3      
  53   3            }
  54   2            temp=coeff.S_aa*coeff.S_bb-coeff.S_ab*coeff.S_ab;
  55   2            dA=(coeff.S_ab*coeff.S_bl-coeff.S_bb*coeff.S_al)/temp;
C51 COMPILER V7.50   CALCPHASE                                                             01/08/2008 15:08:11 PAGE 2   

  56   2            dF=(coeff.S_ab*coeff.S_al-coeff.S_aa*coeff.S_bl)/temp;
  57   2            (*amp)+=dA;
  58   2            (*phase)+=dF;
  59   2            j++;
  60   2         }while((fabs(dF)>0.00125)&&(j<4));
  61   1      
  62   1      
  63   1      }
  64               
  65          //--------------------------------------根据测量数据计算初相位角函数-----------------------------
  66          //dat---测量数据数组,长度128,(13个周期,等间隔采样128个数据)
  67          //返回细分值(单位:等分数)
  68          INT16 GetPhaseFromMeasDat(INT16 dat[])
  69          {
  70   1         UINT8 i;   
  71   1         float fi,A;
  72   1         float XDATA_MEM dat_avg[SAMPLE_NUMS];
  73   1         float base=0;
  74   1      
  75   1         for(i=0;i<SAMPLE_NUMS;i++)base+=dat[i]; //求基准电平
  76   1         base/=SAMPLE_NUMS;
  77   1      
  78   1         for(i=0;i<SAMPLE_NUMS;i++)dat_avg[i]=(float)dat[i]-base; //求正弦值
  79   1      
  80   1         fi=atan2(dat_avg[0],dat_avg[32]);     //解算初始振幅及初相角
  81   1      
  82   1         A=sqrt((float)dat_avg[0]*dat_avg[0]+dat_avg[32]*dat_avg[32]);
  83   1      
  84   1         AvgErr(dat_avg,&A,&fi);  //平差
  85   1      
  86   1         while(fi<0)   //转换到正值
  87   1         {
  88   2            fi+=2*PI;
  89   2         }
  90   1         return fi*1250/PI+0.5;  //转换为细分值
  91   1      
  92   1      }
  93          
  94          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1503    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----     560
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      27
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -