亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fft4.c

?? FFT定點源碼 基4
?? C
字號:
/****************************************************
* FFT4.c
* implements the functions defined in FFT.h
*
* by Cliff Zhou
* on Apr 12, 2007
* in Innofidei, Inc. Beijing
*
* Revision:
*
*
*(C) 2006-2010, Innofidei Corporation, Beijing. All Rights Reserved.
*
****************************************************/


#include <math.h>			//using absolute value in scale_sense
#include <stdio.h>			
#include <stdlib.h>
#include "FFT4.h"
#include "../../common/src/type.h"


/**** DITFFT ***************************************************************
* radix-4 FFT,  processing 4^k data
*
* INPUTS:
*	FFTnum, signed complex data to be transformed, each IQ components at 12bits
*	n,	 FFT length and data length of FFTdata
*	num_ppln, number of pipeline for Cordic, 15 pipeline in transmitter
*
* OUTPUT:
*	FFTnum, the processed data stored in the same buffer as input data in Bit-Reverse order
*
* RETURN: no
*
******************************************************************************/


int DITFFT(scint16* FFTnum, int* scaled, int n, int shift, ubyte num_ppln)
{
	int 		step, i, j;
	scint32 	product1, product2, product3, product4;
	scint32 	sum1,sum2, sum3, sum4;
	scint16		a1, a2, a3, a4;
	
	int stage=0;
	//int shift = 0;		//the first stage, not need shifting
			
	
	sint32 coef_addr;		//phase of twiddle factor from 0 ~ 4095, representing 0 ->pi-> -pi -> 0

	int	fft_stage = 0;			//total fft stages
	int 	tmp = n;			//to get total fft stage
	
	while( tmp > 1)
	{
		tmp = tmp / RADIX;
		fft_stage ++;
	}


	step=n/RADIX;		//step size in each butterfly

	while(step>=1)		//at each stage, outer loop
	{
				/* total scaled bits */
				*scaled +=  shift;
		
		for(j=0;j<n/(step*RADIX);j++)		//For j part of butterfly, middle loop
		{
			
			for(i=0;i<step;i++)		//Inner loop
			{
				/*scaling input data from 16bit to 12bit (effective)*/

				a1 = scaling( FFTnum[i+j*4*step], shift);
				a2 = scaling( FFTnum[i+step+j*4*step], shift);
				a3 = scaling( FFTnum[i+2*step+j*4*step], shift);
				a4 = scaling( FFTnum[i+3*step+j*4*step], shift);
				
				

				/* four point DFT, from 12bits to 14bits. then left shift 4bits as in 20bits to Cordic */
				sum1.real= (a1.real+a2.real+a3.real+a4.real) << SHIFT4 ;
	            sum1.imag= (a1.imag+a2.imag+a3.imag+a4.imag) << SHIFT4 ;
				sum2.real= (a1.real+a2.imag-a3.real-a4.imag) << SHIFT4 ;
				sum2.imag= (a1.imag-a2.real-a3.imag+a4.real) << SHIFT4 ;
	            sum3.real= (a1.real-a2.real+a3.real-a4.real) << SHIFT4 ;
				sum3.imag= (a1.imag-a2.imag+a3.imag-a4.imag) << SHIFT4 ;
	            sum4.real= (a1.real-a2.imag-a3.real+a4.imag) << SHIFT4 ;
				sum4.imag= (a1.imag+a2.real-a3.imag-a4.real) << SHIFT4 ;


								
				//multiplied by twiddle factor except the last stage, with Cordic
				//CORDIC phase is 20bits from -pi to pi
				//data from 15bits to 16bits, inside pipeline using 15+5 = 20bit
				if ( step != 1) {
					coef_addr = coef_addr_gen(i+j*4*step, stage, n);
					product1 = p2r_cordic32(sum1, coef_addr << (P_WIDTH - fft_stage*2), num_ppln) ;	//20bit phase and 20bits data
					
				    	coef_addr = coef_addr_gen(i+step+j*4*step, stage, n);
				    	product2 = p2r_cordic32(sum2,  coef_addr << (P_WIDTH - fft_stage*2), num_ppln);
				    	
				    	coef_addr = coef_addr_gen(i+2*step+j*4*step, stage, n);
				    	product3 = p2r_cordic32(sum3,  coef_addr << (P_WIDTH - fft_stage*2), num_ppln);
				    	
				    	coef_addr = coef_addr_gen(i+3*step+j*4*step, stage, n);
				    	product4 = p2r_cordic32(sum4,  coef_addr <<(P_WIDTH - fft_stage*2), num_ppln);
			    	}
			    	else		
			    	{
			    		product1 = sum1;
			    		product2 = sum2;
			    		product3 = sum3;
			    		product4 = sum4;
			    	}
			    	
			    	/*mem is 16bits*/				
				FFTnum[i+j*4*step].real		= (sint16)(product1.real>>SHIFT4 );
			    	FFTnum[i+step+j*4*step].real	= (sint16)(product2.real>>SHIFT4 );
			    	FFTnum[i+2*step+j*4*step].real	= (sint16)(product3.real>>SHIFT4 );
			    	FFTnum[i+3*step+j*4*step].real	= (sint16)(product4.real>>SHIFT4 );
			    	

				FFTnum[i+j*4*step].imag			= (sint16)(product1.imag>>SHIFT4 );
			    	FFTnum[i+step+j*4*step].imag	= (sint16)(product2.imag>>SHIFT4 );
			    	FFTnum[i+2*step+j*4*step].imag	= (sint16)(product3.imag>>SHIFT4 );
			    	FFTnum[i+3*step+j*4*step].imag	= (sint16)(product4.imag>>SHIFT4 );
			    	
			}
		}
		
		//test the max left shift bits to get the full range of memory
		shift = scale_sense(FFTnum, n);

		/*** to set scaling for each stage manually ****/
		//if (stage < 2) shift = 2;
		//else		shift = 3;

		if ( FFT_DEBUG > 0 )
			printf("\tSHIFT=%d\n", shift);
			
		step=step/RADIX ;
		stage++;		
				
	}
	
	/*bit reverse*/
	reorder(FFTnum, n);
	
	return shift;
}


/**** reorder ***************************************************************
* bit-reverse in radix-4 for processed data before output. 
*
* INPUTS:
*	FFTnum, processed signed complex data , each IQ components at 16bit
*	n,	 FFT length and data length of FFTdata
*
* OUTPUT:
*	FFTnum, the processed data stored in Natural order
*
* RETURN: no
*
******************************************************************************/

void reorder(scint16* FFTnum, int N)
{
	int sn,si,ci,i,j,stage;
	scint16* temp; 			//to store the bit reversed data
    
	sn=N;
	stage=0;

	temp = (scint16 *)malloc(N * sizeof(scint16));

	//get total stage of IFFT
	while(sn>1)
	{
		sn=sn >> 2;		//two bits in radix-4
		stage++;
	}

	for(i=0;i<N;i++)
	{   
		ci=0;
		si=i;
		
		for(j=0;j<stage;j++)
		{
            		ci=(ci << 2) + (si & 0x03);
			si= si >> 2;
		 }

		temp[ci]=FFTnum[i];
	}

	//store data back into memory
	for(i=0;i<N;i++)
	{
		FFTnum[i]=temp[i];
	}
}




/**** scale_sense ***************************************************************
* test the max absolute value for each I and Q in each FFT stage, AND
* determine the shifting bits to reach the signed 12bits
*
* INPUTS:
*	FFTnum, processed signed complex data , each IQ components at 16bit
*	n,	 FFT length and data length of FFTdata
*
* OUTPUT:
*	return the left shift bits to 16bits in each IFFT stage
*
******************************************************************************/
int scale_sense(scint16 * FFTnum, int n)
{
	int i;
	int shift = 0;			
	int max_abs = 0;
	int pos = 0;		//for testing purpose
	
	//test the max component of data at one stage
	for(i=0; i<n; i++)
	{
		if( abs(FFTnum[i].imag) > max_abs )	{max_abs = abs(FFTnum[i].imag); pos = i;}
		if( abs(FFTnum[i].real) > max_abs )	{max_abs = abs(FFTnum[i].real); pos = i;}
	}
	
	//printf("Max = %d @ position = %d\n", max_abs, pos);
	//determine the left shifting bits to reach full range of 16bit memory
	if (max_abs <= D_MAX)
		while( (max_abs = max_abs * 2) < D_MAX ) 	shift--;
	else 
	{
		shift++;
		while( (max_abs = max_abs / 2) > D_MAX ) 	shift++;

	}
	
	//printf("Shift = %d\n", shift);
	
	return shift;
}


/**** coef_addr_gen ***************************************************************
* calculate the twiddle factor phase in 0 ~ 4095 for each address at each stage 
*
* INPUTS:
*	d_addr, data address in memory, unsigned 12bit
*	stage,	 stage number of FFT, from 0 ~ 6
*
* OUTPUT:
*	return the twiddle factor phase from 0 to 4095, unsigned 12bits
*
******************************************************************************/
/****************************
int coef_addr_gen(int d_addr, int stage)
{
	int  cj, quad;
	int address;
	
	int step;			//stage 1's butterfly step size
	

    	
	step = 1;
	cj = (d_addr >> (10-stage*2) ) & 0x03;
	quad = d_addr & (0x0fff >> (stage*2+2));
		
	step = step << (stage*2);
	
	
	address = cj * step * quad;
	
	address = 4096 - address;	//FFT: using negative phase
		
	return address;
	
}
**************************************************************************************/
int coef_addr_gen(int d_addr, int stage, int N)
{
	int  cj, quad;
	int address;
	
	int step;			//stage 1's butterfly step size
	int mask = 0x03;
	int i=1;
	
	int	fft_stage = 0;			//total fft stages
	int 	tmp = N;			//to get total fft stage
	
	while( tmp > 1)
	{
		tmp = tmp / RADIX;
		fft_stage ++;
	}

	for(i=1; i<fft_stage; i++)
		mask = (mask << 2) + 3;

	
    	
	step = 1;
	cj = (d_addr >> (fft_stage*2-2-stage*2) ) & 0x03;
	quad = d_addr & (mask >> (stage*2+2));
		
	step = step << (stage*2);
	
	
	address = cj * step * quad;
	
	address = N - address;	//FFT: using negative phase
		
	return address;
	
}


/**** scaling *****************************************************************
* scale a complex 16bit input data by 'shift' bits, either left(neg) or right(pos) bits. 
*	if shift < 0, left shifting abs(shift) bits, 2^abs(shift)
*	if shift > 0, right shifting shift bits AND rounding to nearest
*	NO overflow control
*
* INPUTS:
*	data, a complex 16bits data, 
*	shift, a signed int for left or right shift bits
*
* OUTPUT:
*	shifted complex number	
*
*******************************************************************************/
scint16 scaling(scint16 data, int shift)
{
	if(shift < 0)
	{
		data.real = data.real << (-shift);
		data.imag = data.imag << (-shift);
	}
	else if(shift > 0)
	{
		data.real = (data.real >> shift) + ((data.real >>(shift-1)) & 0x01);
		data.imag = (data.imag >> shift) + ((data.imag >>(shift-1)) & 0x01 );
	}

	return data;
}






	


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美在线你懂的| 欧美午夜精品久久久久久孕妇| 亚洲午夜久久久久久久久电影院| 国产精品蜜臀av| 亚洲视频网在线直播| ●精品国产综合乱码久久久久| 中文久久乱码一区二区| 国产精品系列在线| 亚洲人成伊人成综合网小说| 亚洲午夜影视影院在线观看| 天天色图综合网| 国产一区三区三区| 成人理论电影网| 欧美在线免费播放| 欧美一区二区久久| 久久久影视传媒| 亚洲免费资源在线播放| 五月天视频一区| 狠狠v欧美v日韩v亚洲ⅴ| 国产成人精品三级| 99re热这里只有精品视频| 91麻豆精品在线观看| 欧美剧情片在线观看| 久久蜜桃av一区精品变态类天堂| 综合色天天鬼久久鬼色| 亚洲成人av一区二区三区| 国产尤物一区二区在线| 色偷偷成人一区二区三区91| 欧美理论在线播放| 久久理论电影网| 亚洲国产精品视频| 国模套图日韩精品一区二区 | 久久网站最新地址| 亚洲欧洲性图库| 日本系列欧美系列| 成人app软件下载大全免费| 欧美视频一区二| 国产精品欧美久久久久无广告| 亚洲成人免费av| 国产不卡高清在线观看视频| 欧美天堂一区二区三区| 久久精品人人做人人综合 | 美女视频免费一区| 色婷婷亚洲精品| 国产精品欧美精品| 黄色资源网久久资源365| 欧美在线一区二区三区| 国产精品视频观看| 激情图区综合网| 7777精品伊人久久久大香线蕉完整版| 国产精品久久精品日日| 国内外成人在线| 日韩一二三区视频| 丝袜a∨在线一区二区三区不卡| 国产成人av一区二区| 91精品国产福利在线观看| 亚洲精品日韩一| 岛国精品在线观看| 久久精品男人天堂av| 秋霞成人午夜伦在线观看| 日本韩国欧美一区| 国产精品久久久久久亚洲毛片 | 色呦呦国产精品| 国产欧美一区二区精品秋霞影院| 日韩国产欧美在线播放| 色噜噜狠狠成人网p站| 国产精品素人一区二区| 国产麻豆精品一区二区| 精品国产一二三区| 国产制服丝袜一区| 精品久久国产字幕高潮| 免费视频最近日韩| 欧美一二三四区在线| 日本特黄久久久高潮| 欧美日本韩国一区二区三区视频 | 欧美午夜精品理论片a级按摩| 一色屋精品亚洲香蕉网站| 成人午夜在线播放| 国产精品麻豆欧美日韩ww| av不卡在线播放| 中文字幕一区二区三| 91视频在线观看免费| 亚洲色图19p| 欧美三级视频在线观看| 亚洲va天堂va国产va久| 在线播放中文字幕一区| 日日骚欧美日韩| 日韩欧美成人午夜| 国产伦精一区二区三区| 国产精品狼人久久影院观看方式| 99热在这里有精品免费| 亚洲欧美区自拍先锋| 欧美午夜在线一二页| 免费一级片91| 国产区在线观看成人精品| 91美女在线视频| 人人超碰91尤物精品国产| 精品久久久久久无| 99麻豆久久久国产精品免费优播| 亚洲色图.com| 欧美电影免费提供在线观看| 粉嫩欧美一区二区三区高清影视| 国产精品理论片在线观看| 欧美色图激情小说| 精品亚洲国内自在自线福利| 日本一区二区三区免费乱视频| 97se亚洲国产综合在线| 天堂成人免费av电影一区| 久久久久亚洲蜜桃| 欧美日韩精品欧美日韩精品一综合| 日本v片在线高清不卡在线观看| 久久久99久久| 在线观看日韩电影| 精品一区二区三区蜜桃| 亚洲欧美日韩人成在线播放| 91麻豆精品国产91久久久资源速度| 国产精品综合网| 亚洲自拍与偷拍| 国产女人18水真多18精品一级做 | 国产精品久久久久影院色老大| 欧美日韩在线播放| 成人在线视频一区| 美女视频一区二区| 亚洲国产精品久久一线不卡| 日本一区二区高清| 欧美成人激情免费网| 91福利国产成人精品照片| 高清视频一区二区| 久久激五月天综合精品| 午夜精品久久久| 成人欧美一区二区三区视频网页 | 56国语精品自产拍在线观看| 国产传媒一区在线| 久久国产精品72免费观看| 亚洲影院免费观看| 国产精品美女久久久久久| 精品久久久久久久久久久久久久久 | 亚洲成人一区二区| 中文字幕在线视频一区| 国产午夜亚洲精品午夜鲁丝片| 欧美一区二区在线播放| 欧美日韩日日夜夜| 欧美在线一区二区| 色婷婷av久久久久久久| 成人免费看黄yyy456| 国产精品一区二区在线观看网站| 秋霞av亚洲一区二区三| 日日夜夜免费精品| 日韩精品每日更新| 丝袜美腿亚洲一区| 日韩国产精品久久久久久亚洲| 亚洲国产婷婷综合在线精品| 亚洲综合色成人| 亚洲国产精品精华液网站| 亚洲精品国产一区二区三区四区在线| 国产精品区一区二区三| 久久久久国产精品厨房| 久久综合色8888| 26uuu亚洲综合色欧美| 欧美精品一区二区三区蜜桃 | youjizz国产精品| 日韩午夜电影av| 国产婷婷色一区二区三区| 午夜精品福利在线| 亚洲一区视频在线观看视频| 亚洲综合在线免费观看| 亚洲高清免费视频| 成人一二三区视频| 岛国精品一区二区| 国产精品乱码人人做人人爱| 亚洲三级在线观看| 国产99一区视频免费| 欧美一级爆毛片| 一级特黄大欧美久久久| 岛国一区二区三区| 精品福利在线导航| 日韩专区在线视频| 日本精品裸体写真集在线观看| 欧美国产综合一区二区| 蜜桃视频一区二区三区在线观看 | 欧美性生活一区| 国产精品久久久久久户外露出| 久久97超碰色| 日韩区在线观看| 视频一区二区三区中文字幕| 色网站国产精品| 亚洲欧美日韩一区二区| 99精品视频在线观看| 国产欧美中文在线| 精品亚洲成a人| 精品少妇一区二区三区在线视频| 亚洲成a人片综合在线| 欧美这里有精品| 亚洲一二三区在线观看| 在线免费观看视频一区| 亚洲精品免费在线观看| 色诱视频网站一区| 亚洲一区影音先锋| 欧美亚日韩国产aⅴ精品中极品| 一级特黄大欧美久久久|