3000点快速傅里叶变换 (DFT) 实现,耗时仅 340 毫秒
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_u 和 H_per_u 数组代表电压谐波,H_i 和 H_per_i 数组代表电流谐波。
原文地址: https://www.cveoy.top/t/topic/pF84 著作权归作者所有。请勿转载和采集!