| 2710 | } |
| 2711 | |
| 2712 | static void rfft4pt(SPFLOAT * ioptr) |
| 2713 | { |
| 2714 | /*** RADIX 8 rfft ***/ |
| 2715 | SPFLOAT f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; |
| 2716 | SPFLOAT t0r, t0i, t1r, t1i; |
| 2717 | SPFLOAT w0r = 1.0 / MYROOT2; /* cos(pi/4) */ |
| 2718 | const SPFLOAT Two = 2.0; |
| 2719 | const SPFLOAT scale = 0.5; |
| 2720 | |
| 2721 | /* bit reversed load */ |
| 2722 | f0r = ioptr[0]; |
| 2723 | f0i = ioptr[1]; |
| 2724 | f1r = ioptr[4]; |
| 2725 | f1i = ioptr[5]; |
| 2726 | f2r = ioptr[2]; |
| 2727 | f2i = ioptr[3]; |
| 2728 | f3r = ioptr[6]; |
| 2729 | f3i = ioptr[7]; |
| 2730 | |
| 2731 | /* Butterflys */ |
| 2732 | /* |
| 2733 | f0 - - t0 - - f0 |
| 2734 | f1 - 1 - f1 - - f1 |
| 2735 | f2 - - f2 - 1 - f2 |
| 2736 | f3 - 1 - t1 - -i - f3 |
| 2737 | */ |
| 2738 | |
| 2739 | t0r = f0r + f1r; |
| 2740 | t0i = f0i + f1i; |
| 2741 | f1r = f0r - f1r; |
| 2742 | f1i = f0i - f1i; |
| 2743 | |
| 2744 | t1r = f2r - f3r; |
| 2745 | t1i = f2i - f3i; |
| 2746 | f2r = f2r + f3r; |
| 2747 | f2i = f2i + f3i; |
| 2748 | |
| 2749 | f0r = t0r + f2r; |
| 2750 | f0i = t0i + f2i; |
| 2751 | f2r = t0r - f2r; |
| 2752 | f2i = f2i - t0i; /* neg for rfft */ |
| 2753 | |
| 2754 | f3r = f1r - t1i; |
| 2755 | f3i = f1i + t1r; |
| 2756 | f1r = f1r + t1i; |
| 2757 | f1i = f1i - t1r; |
| 2758 | |
| 2759 | /* finish rfft */ |
| 2760 | t0r = f0r + f0i; /* compute Re(x[0]) */ |
| 2761 | t0i = f0r - f0i; /* compute Re(x[N/2]) */ |
| 2762 | |
| 2763 | t1r = f1r + f3r; |
| 2764 | t1i = f1i - f3i; |
| 2765 | f0r = f1i + f3i; |
| 2766 | f0i = f3r - f1r; |
| 2767 | |
| 2768 | f1r = t1r + w0r * f0r + w0r * f0i; |
| 2769 | f1i = t1i - w0r * f0r + w0r * f0i; |