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

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

?? fouriertransforms.cpp

?? fft變換代碼,采用基2的頻率域變換代碼.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************
Copyright (C), 2008, LusterLightVision.
FileName: FourierTransforms.cpp
作    者: 趙敏   
版    本: 1.00  
日    期: 08/06/20
模塊描述:  
該模塊為《付立葉變換》的代碼實現。    

主要函數及其功能:   
	FFT_1D()		    一維付立葉正變換
	IFFT_1D()	        一維付立葉逆變換	
	FFT_2D()		    二維付立葉變換
	IFFT_2D()           二維傅立葉反變換
	DIBFFT_2D           圖像傅立葉變換
	  修改歷史記錄:         
	  <編號>  <作者>   <時間>   <版本>   <描述>
	  1     趙敏   08/06/20   1.00    創建該模塊,實現基本功能 
	  
***********************************************************/


#include "stdafx.h"
#include "LLVFourierTransforms.h"
#include "math.h"
#include <xmmintrin.h>
#include <emmintrin.h>


#define xmalloc(s) ::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, (s))   //Dll中分配內存
#define xfree(p)   ::HeapFree (::GetProcessHeap(), 0, (p))                  //調用模塊中釋放內存

/*************************************************************************
*
* 函數名稱:
*   FFT_1D()
*
* 參數:
*   complex<double> * pCTData	- 指向時域數組的指針
*   complex<double> * pCFData	- 指向頻域數組的指針
*   nLevel						-付立葉變換蝶形算法的級數,2的冪數
*
* 返回值:
*   無。
*
* 說明:
*   該函數用來實現快速付立葉變換。
*
************************************************************************/

LLVPRO_API void FFT_1D(complex<double> * pCTData, complex<double> * pCFData, int nLevel)
{
	// 付立葉變換點數
	long	lcount;
	
	// 循環變量
	int		i,j,k;
	
	int p;
	
	// 某一級長度
	int	nBtFlyLen = 0;
	
	// 角度
	double	dAngle;
	
	complex<double> *pCW,*pCWork1,*pCWork2,*pCTmp;
	
	// 計算付立葉變換點數
	lcount = 1 << nLevel;
	
	// 分配運算所需存儲器
	pCW     = new complex<double>[lcount / 2];
	pCWork1 = new complex<double>[lcount];
	pCWork2 = new complex<double>[lcount];
	
	double dCof = PI * 2 / lcount;
	
	// 計算加權系數
	for(i = 0; i < lcount / 2; i++)
	{
		dAngle = -i * dCof;
		pCW[i] = complex<double> (cos(dAngle), sin(dAngle));
	}
	
	// 將時域點寫入pCWork1
    memcpy(pCWork1, pCTData, sizeof(complex<double>) * lcount);
	

	int nBtFlyLenHalf;
	
	// 采用蝶形算法進行快速付立葉變換
	for(k = 0; k < nLevel; k++)
	{
		for(j = 0; j < 1 << k; j++)
		{
			// 計算長度
			nBtFlyLen  = 1 << (nLevel-k);
			
			nBtFlyLenHalf = nBtFlyLen / 2;
			
			for(i = 0; i < nBtFlyLenHalf; i++)
			{
				p = j * nBtFlyLen;

				int nIndex1 = i + p;
				int nIndex2 = nIndex1 +nBtFlyLenHalf;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[i * (1<<k)];

			}
		}
		// 交換pCWork1和pCWork2的數據
		pCTmp   = pCWork1;
		pCWork1 = pCWork2;
		pCWork2 = pCTmp;
	}
	
	// 變換后序列是碼字倒序排列的,需要重新排序
	for(j = 0; j < lcount; j++)
	{
		p = 0;
		for(i = 0; i < nLevel; i++)
		{
			if (j&(1<<i))
			{
				p+=1<<(nLevel-i-1);
			}
		}
		pCFData[j] = pCWork1[p];
	}
	
	// 釋放內存

	delete []pCW;
	delete []pCWork1;
	delete []pCWork2;
	
	pCW		=	NULL	;
	pCWork1 =	NULL	;
	pCWork2 =	NULL	;
	

}


LLVPRO_API void FFT_1D_Opti(complex<double> * pCTData, complex<double> * pCFData, int nLevel)
{
	// 付立葉變換點數
	long	lcount;
	
	// 循環變量
	int		i,j,k;

	// 某一級長度
	int	nBtFlyLen = 0;
	
	// 角度
	double	dAngle;
	
	complex<double> *pCW,*pCWork1,*pCWork2,*pCTmp;
	
	// 計算付立葉變換點數
	lcount = 1 << nLevel;
	
	// 分配運算所需存儲器
	pCW     = new complex<double>[lcount / 2];
	pCWork1 = new complex<double>[lcount];
	pCWork2 = new complex<double>[lcount];
	
	double dCof = PI * 2 / lcount;

	// 計算加權系數
	for(i = 0; i < lcount / 2; i++)
	{
		dAngle = -i * dCof;

		double dcosA = cos(dAngle);
		double dsinA = sqrt(1- dcosA*dcosA);

		pCW[i] = complex<double> (dcosA, -dsinA);
	}
	
	// 將時域點寫入pCWork1
    memcpy(pCWork1, pCTData, sizeof(complex<double>) * lcount);
	
	int nBtFlyLenHalf,nIndex1,nIndex2,p;

	__m128d  md1,md2,md3,md4,md5,md6;

	// 采用蝶形算法進行快速付立葉變換
	for(k = 0; k < nLevel; k++)
	{
		for(j = 0; j < 1 << k; j++)
		{
			// 計算長度
			nBtFlyLenHalf = 1 << (nLevel-k-1);
			nBtFlyLen  = 1 << (nLevel-k);
			
			p = j * nBtFlyLen;	
			
			for(i = 0; i < (nBtFlyLenHalf&~7) ; i+=8)
			{
											
			/*		
			    nIndex1 = i + p;
			    nIndex2 = nIndex1 + nBtFlyLenHalf;
				md1 = _mm_set_pd(pCWork1[nIndex1].imag(),pCWork1[nIndex1].real());  // 讀取數據
				md2 = _mm_set_pd(pCWork1[nIndex2].imag(),pCWork1[nIndex2].real());  // 讀取數據
				
				md3 = _mm_add_pd(md1,md2);    // pCWork1[i + p] + pCWork1[i + p +nBtFlyLenHalf ];
				md4 = _mm_sub_pd(md1,md2);    // pCWork1[i + p] - pCWork1[i + p +nBtFlyLenHalf ];

				int n = i <<k;
				md1 = _mm_set_pd(pCW[n].real(),pCW[n].real());
				md5 = _mm_mul_pd(md4,md1);

				md1 = _mm_set_pd(pCW[n].imag(),pCW[n].imag());
				md4 = _mm_shuffle_pd(md4,md4,1);
				md4 = _mm_mul_pd(md4,md1);
				md6 = _mm_add_pd(md5,md4);
				md5 = _mm_sub_pd(md5,md4);

				md6 = _mm_shuffle_pd(md5,md6,2);

                double dWorks[2];				
				_mm_storeu_pd(dWorks,md3);

				pCWork2[nIndex1] = complex<double>(dWorks[0], dWorks[1]);
			
				_mm_storeu_pd(dWorks,md6);				
				pCWork2[nIndex2] = complex<double>(dWorks[0], dWorks[1]);
            //*/

				nIndex1 = i + p;
				nIndex2 = i + p + nBtFlyLenHalf;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[i <<k];

				

				nIndex1 = i + p + 1;
				nIndex2 = i + p + nBtFlyLenHalf + 1;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[(i+1) <<k];

				nIndex1 = i + p + 2;
				nIndex2 = i + p + nBtFlyLenHalf + 2;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[(i+2) <<k];

				nIndex1 = i + p + 3;
				nIndex2 = i + p + nBtFlyLenHalf + 3;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[(i+3) <<k];
	
				nIndex1 = i + p + 4;
				nIndex2 = i + p + nBtFlyLenHalf + 4;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[(i+4) <<k];				

				nIndex1 = i + p + 5;
				nIndex2 = i + p + nBtFlyLenHalf + 5;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[(i+5) <<k];

				nIndex1 = i + p + 6;
				nIndex2 = i + p + nBtFlyLenHalf + 6;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[(i+6) <<k];

				nIndex1 = i + p + 7;
				nIndex2 = i + p + nBtFlyLenHalf + 7;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[(i+7) <<k];							

			}
			
			for(i = (nBtFlyLenHalf&~7); i < nBtFlyLenHalf ; i++)
			{
				nIndex1 = i + p;
				nIndex2 = nIndex1 + nBtFlyLenHalf;
				
				pCWork2[nIndex1] = pCWork1[nIndex1] + pCWork1[nIndex2];
				pCWork2[nIndex2] = (pCWork1[nIndex1] - pCWork1[nIndex2]) * pCW[i <<k];
			}				
				
		}
		// 交換pCWork1和pCWork2的數據
		pCTmp   = pCWork1;
		pCWork1 = pCWork2;
		pCWork2 = pCTmp;
	}

	
	// 變換后序列是碼字倒序排列的,需要重新排序
	__m128i m0,m1,m2,m,m3,m4,m5,mp;

    _declspec(align(16)) int  nIndex[4] = {0,0,0,0} ;

	m  = _mm_set1_epi32(1);
	m0 = _mm_setzero_si128();

	for(j = 0; j < lcount; j++)
	{
		mp = _mm_set1_epi32(0);		
	    m1 = _mm_set1_epi32(j);

		
		for(i = 0; i < (nLevel&~3); i +=4)
		{
		
			// i
			m2 = _mm_slli_epi32(m,i);
			m2 = _mm_and_si128(m1,m2);			
			m2 = _mm_cmpgt_epi32(m2,m0);
			m3 = _mm_slli_epi32(m,nLevel-i-1);
			
            m2 = _mm_and_si128(m3,m2);
			mp = _mm_add_epi32(mp,m2);
			
            // i+1
			m2 = _mm_slli_epi32(m,i+1);
			m2 = _mm_and_si128(m1,m2);			
			m2 = _mm_cmpgt_epi32(m2,m0);		
			m3 = _mm_slli_epi32(m,nLevel-i-2);


            m2 = _mm_and_si128(m3,m2);
			mp = _mm_add_epi32(mp,m2);

			// i+2
			m2 = _mm_slli_epi32(m,i+2);
		
			m2 = _mm_and_si128(m1,m2);			
			m2 = _mm_cmpgt_epi32(m2,m0);		
			m3 = _mm_slli_epi32(m,nLevel-i-3);

            m2 = _mm_and_si128(m3,m2);
			mp = _mm_add_epi32(mp,m2);
 
			// i+3
			m2 = _mm_slli_epi32(m,i+3);	
			m2 = _mm_and_si128(m1,m2);			
			m2 = _mm_cmpgt_epi32(m2,m0);		
			m3 = _mm_slli_epi32(m,nLevel-i-4);
			
            m2 = _mm_and_si128(m3,m2);
			mp = _mm_add_epi32(mp,m2);

			
		}
		 _mm_store_si128((__m128i*)nIndex, mp);
		 
        p = nIndex[0];	
		for(i=nLevel & ~3; i<nLevel;i++)
		{
			if (j&(1<<i))
			{
				p+=1<<(nLevel-i-1);
			}

		}
		pCFData[j] = pCWork1[p];
	}
	
	// 釋放內存

	delete []pCW;
	delete []pCWork1;
	delete []pCWork2;
	
	pCW		=	NULL	;
	pCWork1 =	NULL	;
	pCWork2 =	NULL	;
	

}


/*************************************************************************
*
* 函數名稱:
*   IFFT_1D()
*
* 參數:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久久无码国产精品| 一区二区欧美在线观看| 一本一道波多野结衣一区二区| 亚洲成人久久影院| 国产嫩草影院久久久久| 日韩一卡二卡三卡四卡| 在线中文字幕一区| 成人免费av在线| 韩国v欧美v亚洲v日本v| 亚洲成年人网站在线观看| 国产精品国产精品国产专区不片| 日韩欧美激情四射| 欧美精品久久久久久久多人混战| 成人av影视在线观看| 极品少妇一区二区三区精品视频| 亚洲一级二级三级在线免费观看| 国产精品系列在线| 久久午夜色播影院免费高清| 欧美一区二区日韩一区二区| 欧美影院一区二区三区| 99精品久久99久久久久| 成人激情校园春色| 国产毛片精品视频| 久草在线在线精品观看| 男女男精品视频网| 亚洲国产成人tv| 亚洲动漫第一页| 亚洲精品自拍动漫在线| **性色生活片久久毛片| 国产精品免费久久| 国产女人aaa级久久久级| 久久久99久久| 欧美国产欧美综合| 久久精品在线免费观看| 久久久噜噜噜久久中文字幕色伊伊 | 久久精品欧美一区二区三区不卡| 99re热这里只有精品视频| 亚洲成av人**亚洲成av**| 欧美精品一区视频| 日本精品一区二区三区高清| 国产主播一区二区| 丝袜诱惑制服诱惑色一区在线观看 | 国产午夜亚洲精品午夜鲁丝片| 一二三四区精品视频| 国产精品久久久久aaaa| 国产精品区一区二区三区| 国产精品欧美极品| 综合久久国产九一剧情麻豆| 亚洲三级在线免费观看| 一区二区三区在线免费视频| 亚洲一区二区三区四区在线观看 | 99麻豆久久久国产精品免费| 懂色一区二区三区免费观看| 国产ts人妖一区二区| av一区二区久久| 色88888久久久久久影院野外| 欧美午夜精品久久久久久超碰 | 99视频一区二区三区| 99久久国产综合色|国产精品| 一本色道久久加勒比精品| 色国产精品一区在线观看| 欧美午夜电影一区| 欧美大片国产精品| 国产日韩成人精品| 亚洲一区在线电影| 麻豆精品在线观看| 丰满少妇久久久久久久| 在线观看精品一区| 日韩亚洲欧美综合| 国产欧美久久久精品影院| 亚洲美女屁股眼交| 麻豆一区二区三| 成人黄色777网| 欧美片网站yy| 国产欧美日韩卡一| 一区二区三区视频在线看| 久久爱www久久做| 91色|porny| 日韩精品一区二区在线| 国产精品国产三级国产aⅴ入口| 亚洲不卡在线观看| 丰满少妇久久久久久久| 久久成人久久爱| 麻豆成人av在线| 国产精品丝袜久久久久久app| 一区二区三区在线视频免费| 日本最新不卡在线| 91在线码无精品| 69精品人人人人| 亚洲美女视频在线| 国产米奇在线777精品观看| 不卡在线视频中文字幕| 欧美日韩免费观看一区三区| 亚洲尤物在线视频观看| 成人综合婷婷国产精品久久蜜臀 | 狠狠色丁香婷婷综合| 91久久精品一区二区| 精品国产sm最大网站| 亚洲国产你懂的| 国产成人av资源| 日韩一二三区不卡| 亚洲风情在线资源站| 成人免费的视频| 久久免费精品国产久精品久久久久| 亚洲国产日韩在线一区模特| 国产精品白丝jk黑袜喷水| 日韩一级在线观看| 视频一区二区三区入口| 99国产精品久久久| 欧美韩国日本一区| 国产伦理精品不卡| 欧美电影免费观看高清完整版在线观看| 樱花影视一区二区| 99久久久无码国产精品| 久久噜噜亚洲综合| 六月丁香综合在线视频| 欧美裸体bbwbbwbbw| 亚洲免费视频成人| 99视频精品免费视频| 亚洲国产成人在线| 国产电影一区二区三区| 精品久久人人做人人爰| 美脚の诱脚舐め脚责91| 欧美一级高清大全免费观看| 亚洲一卡二卡三卡四卡| 在线亚洲人成电影网站色www| 亚洲男人的天堂一区二区| 9色porny自拍视频一区二区| 欧美国产激情二区三区 | 欧美日韩免费电影| 一区二区三区免费观看| 91亚洲精品乱码久久久久久蜜桃 | 欧美性大战xxxxx久久久| 日韩欧美一二区| 成人动漫视频在线| 青娱乐精品视频在线| 久久 天天综合| 亚洲免费av在线| 久久女同精品一区二区| 99麻豆久久久国产精品免费优播| 亚洲一区在线观看视频| 亚洲视频在线一区观看| 色哦色哦哦色天天综合| 久草精品在线观看| 丝袜美腿高跟呻吟高潮一区| 国产三级精品视频| 欧美日韩国产小视频在线观看| 欧美午夜不卡在线观看免费| 性久久久久久久久| 欧美情侣在线播放| 久久激五月天综合精品| 久久精品男人天堂av| 春色校园综合激情亚洲| 亚洲激情第一区| 欧美精选一区二区| 经典三级一区二区| 国产日产亚洲精品系列| 91猫先生在线| 日韩电影在线看| 久久久不卡网国产精品一区| 成人自拍视频在线| 伊人开心综合网| 欧美一区二区在线视频| 高清不卡一区二区在线| 亚洲免费伊人电影| 日韩欧美国产综合一区| 大桥未久av一区二区三区中文| 亚洲尤物视频在线| 精品国产一二三| 97久久人人超碰| 欧美bbbbb| 国产精品乱码一区二区三区软件| 日本韩国欧美一区| 激情欧美一区二区三区在线观看| 国产精品久久二区二区| 制服丝袜在线91| www.视频一区| 奇米影视在线99精品| 国产精品动漫网站| 日韩一区二区三区在线视频| 成人精品在线视频观看| 婷婷久久综合九色综合伊人色| 日本一区二区三区在线观看| 欧美另类一区二区三区| 成人激情av网| 秋霞电影网一区二区| 亚洲三级在线免费观看| 亚洲精品一区二区三区香蕉| 欧美在线啊v一区| 国产精品一区二区免费不卡| 亚洲国产成人tv| 亚洲天天做日日做天天谢日日欢| 日韩无一区二区| 欧美亚洲图片小说| 成人自拍视频在线观看| 美女任你摸久久| 亚洲午夜激情网页| 国产精品毛片高清在线完整版| 日韩三级伦理片妻子的秘密按摩| 色乱码一区二区三区88|