void DFT1(void) // 2022-3-7 3000点最多340mS
{
  u32 i, j, k, n, pll_err; // n1, n2, num_f;
  float p, q; // r, s, t, w, ut, at, ut_even, at_even, ut_odd, at_odd;
  int64_t r_s64, s_s64, t_s64, w_s64; 
  // u8 DFT_UpperLimit;
  

  // 1----------------226ms    改进后175ms   增加功能后182ms     增加Routine_Process();后212ms
  pll_err = 0;
  

  p = Base_Freq; // 2022-3-7(float)SAMPLE_RATE / (float)3000.0f * (float)wave_num_now; // zyz:2014-6-19
  if (p < 75.0f) { DFT_UpperLimit = 50 + 1; }
  else if (p < 150.0f) { DFT_UpperLimit = 32 + 1; }
  else if (p < 300.0f) { DFT_UpperLimit = 16 + 1; }
  else if (p < 600.0f) { DFT_UpperLimit = 8 + 1; }
  else if (p < 1200.0f) { DFT_UpperLimit = 4 + 1; }
  else            { DFT_UpperLimit = 0; pll_err = 1; goto exit_DFT; }
  
  q = DOUBLE_PI / 3000;
  n = 1500 + 1;
  // ad_num_valid_old = ad_num_valid;
  // timer_test = timer_1ms;  
  for (i = 0; i < n; i++) //
  {
    p = q * (float)i;
    k = 3000 - i;
    cos_tbl[i] = cos(p) * 8388608.0f;   // 8388608 = 2^23     
    cos_tbl[k] = cos_tbl[i];
    sin_tbl[i] = sin(p) * 8388608.0f;
    sin_tbl[k] = -sin_tbl[i];
    if ((i % 100) == 0) // 2022-3-7
    {
      Routine_Process();
    }
  }
  Routine_Process();

  for (i = 1; i < DFT_UpperLimit; i++)
  {
    r_s64 = 0;
    s_s64 = 0;
    t_s64 = 0;
    w_s64 = 0;

    n = wave_num_now * i;
    for (j = 0; j < ad_num_valid; j++)
    {
      k = (n * j) % ad_num_valid;

      r_s64 += (int64_t)(ShanBian_Count3 * ShanBian_FFT_Buffer1[j] + ShanBian_Count4 * ShanBian_FFT_Buffer2[j]) * (int64_t)cos_tbl[k];
      s_s64 += (int64_t)(ShanBian_Count3 * ShanBian_FFT_Buffer1[j] + ShanBian_Count4 * ShanBian_FFT_Buffer2[j]) * (int64_t)sin_tbl[k];
      t_s64 += (int64_t)I0_FFT_AD_BUFF[j] * (int64_t)cos_tbl[k];
      w_s64 += (int64_t)I0_FFT_AD_BUFF[j] * (int64_t)sin_tbl[k];
    }
    r_s64 >>= 23; s_s64 >>= 23;
    t_s64 >>= 23; w_s64 >>= 23;
    H_u_temp[i] = (float)(r_s64 * r_s64 + s_s64 * s_s64);
    H_i_temp[i] = (float)(t_s64 * t_s64 + w_s64 * w_s64);
    // H_angl_u[i] = (atan2(r_s64, s_s64)) * 57.295779;
    // H_angl_i[i] = (atan2(t_s64, w_s64)) * 57.295779;
    if (i == 1)
    {
      Deg_R_U0 = (atan2(-s_s64, r_s64)); // * 57.295779f; // 2022-3-7
      Deg_R_I0 = (atan2(-w_s64, t_s64)); // * 57.295779f; // 2022-3-7
    }
    Routine_Process();
  }
  for (i = DFT_UpperLimit; i < 51; i++)
  {
    H_u_temp[i] = 0.0;
    H_i_temp[i] = 0.0;
  }
  Routine_Process();
  p = (float)ad_num_valid * 0.70710678f / Hv_Coefficient;
  Routine_Process();
  if ((H_u_temp[1] > 0.0f) && (value[v_ac] > 0.0f))
  {
    H_u_temp[51] = 0;
    for (i = 1; i < 51; i++) //
    {
      H_u_temp[51] += H_u_temp[i];
    }
    H_u_temp[51] = sqrt(H_u_temp[51]) / p;
    if (THD_standard == 0)
    {
      for (i = 1; i < 51; i++) //
      {
        H_u[i] = sqrt(H_u_temp[i]) / p;
        H_per_u[i] = H_u[i] / H_u[1] * 100.0f;
      }
    }
    else
    {
      for (i = 1; i < 51; i++) //
      {
        H_u[i] = sqrt(H_u_temp[i]) / p; // 谐波
        H_per_u[i] = H_u[i] / H_u_temp[51] * 100.0f;
      }
    }
    H_u[51] = H_u_temp[51];
    H_u[0] = sqrt((fabs)(H_u[51] * H_u[51] - H_u[1] * H_u[1]));
    if (THD_standard == 0) { H_per_u[0] = H_u[0] / H_u[1] * 100.0f; }
    else { H_per_u[0] = H_u[0] / H_u[51] * 100.0f; }
  }
  else
  {
    for (i = 0; i < 52; i++) //
    {
      H_u[i] = 0.0f;
      H_per_u[i] = 0.0f;
    }
    Deg_R_U0 = 0.0; // 2022-3-7
  }
  Routine_Process();
  p = (float)ad_num_valid * 0.70710678f / Hi_Coefficient;
  if ((H_i_temp[1] > 0.0f) && (value[a_ac] > 0.0f))
  {
    H_i_temp[51] = 0;
    for (i = 1; i < 51; i++) //
    {
      H_i_temp[51] += H_i_temp[i];
    }
    H_i_temp[51] = sqrt(H_i_temp[51]) / p;
    if (THD_standard == 0)
    {
      for (i = 1; i < 51; i++) //
      {
        H_i[i] = sqrt(H_i_temp[i]) / p;
        H_per_i[i] = H_i[i] / H_i[1] * 100.0f;
      }
    }
    else
    {
      for (i = 1; i < 51; i++) //
      {
        H_i[i] = sqrt(H_i_temp[i]) / p;
        H_per_i[i] = H_i[i] / H_i_temp[51] * 100.0f;
      }
    }
    H_i[51] = H_i_temp[51];
    H_i[0] = sqrt(H_i[51] * H_i[51] - H_i[1] * H_i[1]);
    if (THD_standard == 0) { H_per_i[0] = H_i[0] / H_i[1] * 100.0f; }
    else { H_per_i[0] = H_i[0] / H_i[51] * 100.0f; }
  }
  else
  {
    for (i = 0; i < 52; i++) //
    {
      H_i[i] = 0.0;
      H_per_i[i] = 0.0;
    }
    Deg_R_I0 = 0.0; // 2022-3-7
  }
  H_u[52] = Deg_R_U0; // 2022-3-7
	H_i[52] = Deg_R_I0; // 2022-3-7
  Routine_Process();
// timer_test2 = timer_1ms - timer_test;  // 242mS
    //--------------
  // 1----------------
exit_DFT:
  
  if (pll_err == 1)
  {
    for (i = 0; i < 52; i++) //
    {
      H_u[i] = 0.0;
      H_per_u[i] = 0.0;

      H_i[i] = 0.0;
      H_per_i[i] = 0.0;

//      Hv_Coefficient = 0.0;
//      Hv_zero = 0.0;
//      Hi_Coefficient = 0.0;
//      Hi_zero = 0.0;
    }
//		H_angl_u[0] = 0.0;
//		H_angl_i[0] = 0.0;
//		H_angl_u[1] = 0.0;
//		H_angl_i[1] = 0.0;
//    for (i = 0; i < 3000; i++) //
//    {
//      U0_FFT_AD_BUFF[i] = 0;
//      I0_FFT_AD_BUFF[i] = 0;
//    }
  }
  else // 2022-3-7
	{
		if (GB17625_1_Status_Change == 0x04)
    {
      GB17625_1_Status_Change = 0x05;
    }
	}
  wave_num_now = 0, ad_num_valid = 0;
  FFT_Sample_En = 2;
	value[THD_v] = H_per_u[0];
	value[THD_a] = H_per_i[0];
	time_test = TimerTicker - time_test;
}

谐波内容: 在函数 DFT1 中,H_uH_per_u 数组代表电压谐波,H_iH_per_i 数组代表电流谐波。


原文地址: https://www.cveoy.top/t/topic/pF84 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录