📄 r_fft.c
字号:
*(farray_ptr + j) = ftmp;
ftmp = *(farray_ptr + i + 1);
*(farray_ptr + i + 1) = *(farray_ptr + j + 1);
*(farray_ptr + j + 1) = ftmp;
}
k = SIZE_BY_TWO;
while (j >= k)
{
j = sub(j, k);
k = shr(k, 1);
}
j += k;
}
/* The FFT part */
if (isign == 1)
{
for (i = 0; i < NUM_STAGE; i++)
{ /* i is stage counter */
jj = shl(2, i); /* FFT size */
kk = shl(jj, 1); /* 2 * FFT size */
ii = ii_table[i]; /* 2 * number of FFT's */
for (j = 0; j < jj; j = j + 2)
{ /* j is sample counter */
ji = j * ii; /* ji is phase table index */
for (k = j; k < SIZE; k = k + kk)
{ /* k is butterfly top */
kj = add(k, jj); /* kj is butterfly bottom */
/* Butterfly computations */
ftmp_real = L_sub(L_mult(*(farray_ptr + kj), phs_tbl[ji]),
L_mult(*(farray_ptr + kj + 1), phs_tbl[ji + 1]));
ftmp_imag = L_add(L_mult(*(farray_ptr + kj + 1), phs_tbl[ji]),
L_mult(*(farray_ptr + kj), phs_tbl[ji + 1]));
tmp1 = round32(ftmp_real);
tmp2 = round32(ftmp_imag);
tmp = sub(*(farray_ptr + k), tmp1);
*(farray_ptr + kj) = shr(tmp, 1);
tmp = sub(*(farray_ptr + k + 1), tmp2);
*(farray_ptr + kj + 1) = shr(tmp, 1);
tmp = add(*(farray_ptr + k), tmp1);
*(farray_ptr + k) = shr(tmp, 1);
tmp = add(*(farray_ptr + k + 1), tmp2);
*(farray_ptr + k + 1) = shr(tmp, 1);
}
}
}
/* The IFFT part */
}
else
{
for (i = 0; i < NUM_STAGE; i++)
{ /* i is stage counter */
jj = shl(2, i); /* FFT size */
kk = shl(jj, 1); /* 2 * FFT size */
ii = ii_table[i]; /* 2 * number of FFT's */
for (j = 0; j < jj; j = j + 2)
{ /* j is sample counter */
ji = j * ii; /* ji is phase table index */
for (k = j; k < SIZE; k = k + kk)
{ /* k is butterfly top */
kj = add(k, jj); /* kj is butterfly bottom */
/* Butterfly computations */
ftmp_real = L_add(L_mult(*(farray_ptr + kj), phs_tbl[ji]),
L_mult(*(farray_ptr + kj + 1), phs_tbl[ji + 1]));
ftmp_imag = L_sub(L_mult(*(farray_ptr + kj + 1), phs_tbl[ji]),
L_mult(*(farray_ptr + kj), phs_tbl[ji + 1]));
tmp1 = round32(ftmp_real);
tmp2 = round32(ftmp_imag);
*(farray_ptr + kj) = sub(*(farray_ptr + k), tmp1);
*(farray_ptr + kj + 1) = sub(*(farray_ptr + k + 1), tmp2);
*(farray_ptr + k) = add(*(farray_ptr + k), tmp1);
*(farray_ptr + k + 1) = add(*(farray_ptr + k + 1), tmp2);
}
}
}
}
} /* end of c_fft () */
void r_fft(Shortword * farray_ptr, Shortword isign)
{
Shortword ftmp1_real, ftmp1_imag, ftmp2_real, ftmp2_imag;
Longword Lftmp1_real, Lftmp1_imag, Lftmp2_real, Lftmp2_imag;
Shortword i, j;
Longword Ltmp1, Ltmp2;
/* The FFT part */
if (isign == 1)
{
/* Perform the complex FFT */
c_fft(farray_ptr, isign);
/* First, handle the DC and foldover frequencies */
ftmp1_real = *farray_ptr;
ftmp2_real = *(farray_ptr + 1);
*farray_ptr = add(ftmp1_real, ftmp2_real);
*(farray_ptr + 1) = sub(ftmp1_real, ftmp2_real);
/* Now, handle the remaining positive frequencies */
for (i = 2, j = SIZE - i; i <= SIZE_BY_TWO; i = i + 2, j = SIZE - i)
{
ftmp1_real = add(*(farray_ptr + i), *(farray_ptr + j));
ftmp1_imag = sub(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
ftmp2_real = add(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
ftmp2_imag = sub(*(farray_ptr + j), *(farray_ptr + i));
Lftmp1_real = L_deposit_h(ftmp1_real);
Lftmp1_imag = L_deposit_h(ftmp1_imag);
Lftmp2_real = L_deposit_h(ftmp2_real);
Lftmp2_imag = L_deposit_h(ftmp2_imag);
Ltmp1 = L_sub(L_mult(ftmp2_real, phs_tbl[i]), L_mult(ftmp2_imag, phs_tbl[i + 1]));
*(farray_ptr + i) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));
Ltmp1 = L_add(L_mult(ftmp2_imag, phs_tbl[i]), L_mult(ftmp2_real, phs_tbl[i + 1]));
*(farray_ptr + i + 1) = round32(L_shr(L_add(Lftmp1_imag, Ltmp1), 1));
Ltmp1 = L_add(L_mult(ftmp2_real, phs_tbl[j]), L_mult(ftmp2_imag, phs_tbl[j + 1]));
*(farray_ptr + j) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));
Ltmp1 = L_add(L_negate(L_mult(ftmp2_imag, phs_tbl[j])), L_mult(ftmp2_real, phs_tbl[j + 1]));
Ltmp2 = L_add(L_negate(Lftmp1_imag), Ltmp1);
*(farray_ptr + j + 1) = round32(L_shr(Ltmp2, 1));
}
}
else
{
/* First, handle the DC and foldover frequencies */
ftmp1_real = *farray_ptr;
ftmp2_real = *(farray_ptr + 1);
*farray_ptr = shr(add(ftmp1_real, ftmp2_real), 1);
*(farray_ptr + 1) = shr(sub(ftmp1_real, ftmp2_real), 1);
/* Now, handle the remaining positive frequencies */
for (i = 2, j = SIZE - i; i <= SIZE_BY_TWO; i = i + 2, j = SIZE - i)
{
ftmp1_real = add(*(farray_ptr + i), *(farray_ptr + j));
ftmp1_imag = sub(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
ftmp2_real = negate(add(*(farray_ptr + j + 1), *(farray_ptr + i + 1)));
ftmp2_imag = negate(sub(*(farray_ptr + j), *(farray_ptr + i)));
Lftmp1_real = L_deposit_h(ftmp1_real);
Lftmp1_imag = L_deposit_h(ftmp1_imag);
Lftmp2_real = L_deposit_h(ftmp2_real);
Lftmp2_imag = L_deposit_h(ftmp2_imag);
Ltmp1 = L_add(L_mult(ftmp2_real, phs_tbl[i]), L_mult(ftmp2_imag, phs_tbl[i + 1]));
*(farray_ptr + i) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));
Ltmp1 = L_sub(L_mult(ftmp2_imag, phs_tbl[i]), L_mult(ftmp2_real, phs_tbl[i + 1]));
*(farray_ptr + i + 1) = round32(L_shr(L_add(Lftmp1_imag, Ltmp1), 1));
Ltmp1 = L_sub(L_mult(ftmp2_real, phs_tbl[j]), L_mult(ftmp2_imag, phs_tbl[j + 1]));
*(farray_ptr + j) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));
Ltmp1 = L_negate(L_add(L_mult(ftmp2_imag, phs_tbl[j]), L_mult(ftmp2_real, phs_tbl[j + 1])));
Ltmp2 = L_add(L_negate(Lftmp1_imag), Ltmp1);
*(farray_ptr + j + 1) = round32(L_shr(Ltmp2, 1));
}
/* Perform the complex IFFT */
c_fft(farray_ptr, isign);
}
} /* end r_fft () */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -