90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #include "ixheaacd_type_def.h"
 | |
| #include "ixheaacd_interface.h"
 | |
| #include "ixheaacd_constants.h"
 | |
| #include "ixheaacd_basic_ops32.h"
 | |
| #include "ixheaacd_function_selector.h"
 | |
| 
 | |
| extern const WORD32 ixheaacd_twiddle_table_fft_32x32[514];
 | |
| extern const WORD8 ixheaacd_mps_dig_rev[16];
 | |
| 
 | |
| VOID ixheaacd_complex_fft_p2_armv7(WORD32 *xr, WORD32 *xi, WORD32 nlength,
 | |
|                                    WORD32 fft_mode, WORD32 *preshift) {
 | |
|   WORD32 i, n_stages;
 | |
|   WORD32 not_power_4;
 | |
|   WORD32 npts, shift;
 | |
|   WORD32 dig_rev_shift;
 | |
|   WORD32 ptr_x[1024];
 | |
|   WORD32 y[1024];
 | |
|   WORD32 npoints = nlength;
 | |
|   WORD32 n = 0;
 | |
|   WORD32 *ptr_y = y;
 | |
|   dig_rev_shift = ixheaacd_norm32(npoints) + 1 - 16;
 | |
|   n_stages = 30 - ixheaacd_norm32(npoints);  // log2(npoints), if npoints=2^m
 | |
|   not_power_4 = n_stages & 1;
 | |
| 
 | |
|   n_stages = n_stages >> 1;
 | |
| 
 | |
|   npts = npoints;  // CALCULATION OF GUARD BITS
 | |
|   while (npts >> 1) {
 | |
|     n++;
 | |
|     npts = npts >> 1;
 | |
|   }
 | |
| 
 | |
|   if (n % 2 == 0)
 | |
|     shift = ((n + 4)) / 2;
 | |
|   else
 | |
|     shift = ((n + 3) / 2);
 | |
| 
 | |
|   for (i = 0; i < nlength; i++) {
 | |
|     ptr_x[2 * i] = (xr[i] / (1 << (shift)));
 | |
|     ptr_x[2 * i + 1] = (xi[i] / (1 << (shift)));
 | |
|   }
 | |
| 
 | |
|   if (fft_mode == -1) {
 | |
|     ixheaacd_complex_fft_p2_asm(ixheaacd_twiddle_table_fft_32x32, nlength,
 | |
|                                 ptr_x, ptr_y);
 | |
|     if (not_power_4) shift += 1;
 | |
|   }
 | |
| 
 | |
|   else {
 | |
|     ixheaacd_complex_ifft_p2_asm(ixheaacd_twiddle_table_fft_32x32, nlength,
 | |
|                                  ptr_x, ptr_y);
 | |
|     if (not_power_4) shift += 1;
 | |
|   }
 | |
| 
 | |
|   for (i = 0; i < nlength; i++) {
 | |
|     xr[i] = y[2 * i];
 | |
|     xi[i] = y[2 * i + 1];
 | |
|   }
 | |
| 
 | |
|   *preshift = shift - *preshift;
 | |
|   return;
 | |
| }
 | |
| 
 | |
| VOID ixheaacd_mps_complex_fft_64_armv7(WORD32 *ptr_x, WORD32 *fin_re,
 | |
|                                        WORD32 *fin_im, WORD32 nlength) {
 | |
|   WORD32 i, n_stages;
 | |
|   WORD32 y[128];
 | |
|   WORD32 npoints = nlength;
 | |
|   WORD32 *ptr_y = y;
 | |
|   const WORD32 *ptr_w;
 | |
|   n_stages = 30 - ixheaacd_norm32(npoints);  // log2(npoints), if npoints=2^m
 | |
| 
 | |
|   n_stages = n_stages >> 1;
 | |
| 
 | |
|   ptr_w = ixheaacd_twiddle_table_fft_32x32;  // 32 BIT TWIDDLE TABLE
 | |
| 
 | |
|   ixheaacd_mps_complex_fft_64_asm(ptr_w, nlength, ptr_x, ptr_y,
 | |
|                                   ixheaacd_mps_dig_rev);
 | |
| 
 | |
|   for (i = 0; i < 2 * nlength; i += 2) {
 | |
|     fin_re[i] = y[i];
 | |
|     fin_im[i] = y[i + 1];
 | |
|   }
 | |
| 
 | |
|   return;
 | |
| }
 |