快速傅里葉變換(FFT)——按時間抽取DIT的基

目錄

    • 【1】前言
      • 1、DIF計算量
      • 2、利用性質改善
    • 【2】公式推導
      • 1、N 到 2*N/2
        • a、分解原序列
        • b、分解后的DFT變換
        • c、一系列化簡操作之后
        • d、蝶形信號流
        • e、計算量總結
      • 2、N/2 到 2*N/4
        • a、分解X2(k)序列
        • b、蝶形信號流(2列)
      • 3、N/4 到 2*N/8
        • a、蝶形信號流(3列)
    • 【3】公式總結
    • 【4】特點以及程序框架講解
      • 1、原址運算
      • 2、倒位序規律
      • 3、蝶形運算兩節點的距離
      • 4、WN^r的確定
      • 5、程序框架
    • 【5】代碼實現

【1】前言

1、DIF計算量

公式
更加清楚地了解計算步驟:
公式
觀察可知:
1、一次復數乘法需用四次實數乘法和二次實數加法;
2、一次復數加法需二次實數加法
3、整個 DFT 運算總共需要 4N^2 次實數乘法和 2N*(2N—1)次實數加法。
總結:
直接計算 DFT,乘法次數和加法次數都是和 N^2 成正比的。

2、利用性質改善

性質
利用這些性質,將較大的N分解為若干個較小的N然后進行運算。

【2】公式推導

1、N 到 2*N/2

a、分解原序列

1

b、分解后的DFT變換

2
3

c、一系列化簡操作之后

4

d、蝶形信號流

1
以N=8的序列為例:
2

e、計算量總結

因而通過第一步分解后, 總共需要(N^2/2)+(N/2)=N(N+l )/2約等于 N^2/2 次復數乘法和 N( N/2-1 )+N = N^2/2 次 復數加法。由此可見,通過這樣分解后的運算工作量差不多節省了一半。

2、N/2 到 2*N/4

a、分解X2(k)序列

1

b、蝶形信號流(2列)

在這里插入圖片描述

3、N/4 到 2*N/8

a、蝶形信號流(3列)

在這里插入圖片描述

【3】公式總結

由于乘法的運算量較大,我們從乘法角度來探討一下,DFT和FFT的運算量。
設N=2^M;有M列的蝶形信號運算。
在這里插入圖片描述
從乘法角度:DFT需要N^2,FFT需要N*lbN;
j計算
當N=2048時,這一比值為372.4,即直接計算DFT的運算量是FFT運算量的372.4倍。
當點數N越大時,FFT的優點更為明顯。

【4】特點以及程序框架講解

1、原址運算

運算
計算之后,將新的X(k)覆蓋原本的X(k)。
注意:是將同一行的X進行覆蓋(后面的列覆蓋前面的列),不同行之間是沒有覆蓋關系的。
所以,最后只需要N個存儲單元。(N個數據,N行)

2、倒位序規律

輸出X(k),序列正常。
輸入序列不正常。
原因:X(n)按照標號n的奇偶而不斷分組。
例子:
1
步驟流程:
I+1,最低位+1,向左進位。
J在二進制最高位+1,逢2向右進位。
由此可以從當前的倒序值計算求得下一個倒序值。
3
觀察變址處理,可以發現,只有當J>I時,才將X(I)和X(J)存儲內容進行互換。

3、蝶形運算兩節點的距離

輸入為倒位序,輸出為正位序,N=2^ M,在第m級運算,兩個節點間的距離為2^(m-1);

4、WN^r的確定

r的變換規律:
1、運算兩個節點中第一個節點標號為k,表示為M位的二進制數。
2、將此二進制數乘以2^(M-m),相當于左移M-m位,把右邊空出,此數位r的二進制數。

5、程序框架

流程框架

【5】代碼實現

沒有驗證代碼的正確性,只是按照上面的流程圖進行敘述。

#define PI 3.14159//數位倒讀
int rev(int i, int m) {//i=0~2^m,m為二進制位數 int j = 0;while (m > 0) {j += (i & 0x01) * (0x01 << (m - 1));//j+=(i%2)*mypow(2,m-1);i >>= 1;//i/=2m -= 1;}return j;
}//快速傅里葉變換
//輸入x(n)、N
//輸出X(k)
void fft(const float real_in[], const float imag_in[], float real_out[], float imag_out[],int N) 
{//【1】獲取Mint M = log2(N);	//【2】倒序for (int i = 0;i < N;i++) {//數位倒讀 int j;j = rev(i, M);real_out[j] = real_in[i];imag_out[j] = imag_in[i];}//【3】for (int m = 1;m <= M;m++){int B = 2 ^ m - 1;for (int J = 0;J <= B - 1;J++){int P = 2 ^ (M - m) * J;for (int k = J;k <= N - 1;k++){float tmpr1, tmpi1, tmpr2, tmpi2;//臨時變量float theta = -2 * PI * P / N ;tmpr1 = real_out[k];tmpi1 = imag_out[k];tmpr2 = cos(theta) * real_out[k + B] - sin(theta) * imag_out[k + B];tmpi2 = cos(theta) * imag_out[k + B] + sin(theta) * real_out[k + B];real_out[k] = tmpr1 + tmpr2;imag_out[k] = tmpi1 + tmpi2;real_out[k + B] = tmpr1 - tmpr2;imag_out[k + B] = tmpi1 - tmpi2;}}}
}

參考資料:

《數字信號處理第三版.劉順蘭版》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378616.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python字符串| 帶示例的format()方法

String.format()方法 (String.format() Method) format() method is used to format the string (in other words - we can say to achieve the functionality like printf() in C language). format()方法用于格式化字符串(換句話說&#xff0c;我們可以說實現了C語言中類似于…

PLSQL Developer使用技巧

1、PL/SQL Developer記住登陸密碼在使用PL/SQL Developer時&#xff0c;為了工作方便希望PL/SQL Developer記住登錄Oracle的用戶名和密碼&#xff1b;設置方法&#xff1a;PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History &#xff0c; “St…

3月份的總結

租房子找了個黑中介&#xff0c;各種扣錢&#xff0c;合租的違約了&#xff0c;押金不要了直接一走了之&#xff0c;水費我們承擔&#xff0c;中介這會兒又把責任推得一干二凈&#xff0c;還耍小聰明&#xff0c;非說我是兩個人住的&#xff0c;各種費用要交兩份。。。我一時氣…

快速傅里葉變換(FFT)——按頻率抽取DIF的基

目錄【1】回顧DIT【2】算法原理【3】運算特點【1】回顧DIT https://blog.csdn.net/qq_42604176/article/details/105559756 【2】算法原理 設序列點數&#xff1a;N2^M,M為正整數。將輸入序列按照前一半、后一半分開。&#xff08;并非按照奇偶分&#xff09; 由于&#xf…

02.2-元素定位(XPath)

XML路徑語言用來確定XML文檔中某部分位置的語言XPath用于在XML文檔中通過元素和屬性進行導航XPath遵守W3C標準XPath節點類型&#xff1a; 元素、屬性、文本、命名空間、指令處理、注釋、文檔 通過路徑表達式從XML文檔中選取節點或節點設置 表達式結果說明/xxx選取根節點xxx/xx…

android ImageView 之 android:scaleTye=

原文&#xff1a;http://juliaailse.iteye.com/blog/1409317 1、scaleType“matrix” 是保持原圖大小、從左上角的點開始&#xff0c;以矩陣形式繪圖。 2、scaleType“fitXY” 是將原圖進行橫方向&#xff08;即XY方向&#xff09;的拉伸后繪制的。 3、scaleType“fitStart…

acquire方法_Python鎖類| 帶有示例的acquire()方法

acquire方法Python Lock.acquire()方法 (Python Lock.acquire() Method) acquire() is an inbuilt method of the Lock class of the threading module in Python. acquisition()是Python中線程模塊的Lock類的內置方法。 This method is used to acquire a lock, either block…

VSS2008 安裝silverlight3.0步驟

需要的Q我359273753 我是新手不知道在哪里上傳附件 汗一個轉載于:https://www.cnblogs.com/ganler1988/archive/2011/03/17/1987367.html

php字符串對象,PHP字符串到對象名稱

好的我有一個字符串……$a_string "Product";我想在調用這樣的對象時使用這個字符串&#xff1a;$this->$a_string->some_function();狄更斯如何動態調用該對象&#xff1f;(不要以為我在PHP 5心中)解決方法:所以你要使用的代碼是&#xff1a;$a_string &quo…

莫比烏斯函數---C++

【問題描述】 莫比烏斯函數&#xff0c;數論函數&#xff0c;由德國數學家和天文學家莫比烏斯(Mobius&#xff0c;1790-1868)提出。梅滕斯(Mertens)首先使用μ(n)作為莫比烏斯函數的記號。而據說&#xff0c;高斯(Gauss)比莫比烏斯早三十年就曾考慮過這個函數。莫比烏斯函數在數…

Opencv——findContours函數再探(由輪廓聯想連通域)

目錄關于調參的一些思考分析圖像的一些角度面積、周長、矩形度、圓形度、寬長比例1&#xff1a;找出汽車輪轂圓孔&#xff08;從輪廓和連通域兩個角度&#xff09;例2&#xff1a;找出芯片中間正方形物體例3&#xff1a;桌面上橘色物體總結關于調參的一些思考 合理的參數設置&…

stl vector 函數_vector :: crend()函數以及C ++ STL中的示例

stl vector 函數C vector :: crend()函數 (C vector::crend() function) vector::crend() is a library function of "vector" header, it is used to get the first element of a vector from reverse ending, it returns a const reverse iterator pointing to th…

.Net DateTime.ToString 格式化輸出 (轉載)

原文 雖然 System.DateTime 本身已經具有了不少現成的格式化輸出&#xff0c;例如&#xff1a; ToLongDateString, ToShortTimeString, ToUniversalTime 等&#xff0c;但是卻遠遠不能滿足我們實際的需要&#xff0c;這就要用到了 DateTime.ToString&#xff0c;就要提到 DateT…

modelsim 編譯 xilinx庫

1.為單個工程加入庫 在某一個目錄建立工程 然后 vlib unisim vcom -work unsim *.vhd 然后就加入了unisim庫 如果是windows的話&#xff0c;工程文件mpf應該是記錄了這個庫的信息&#xff0c;所以重新打開這個工程時&#xff0c;依然有這個庫 linux&#xff0c;不用gui界面…

php 字符串匹配 like,ThinkPHP like模糊查詢,like多匹配查詢,between查詢,in查詢,一般查詢書寫方法...

搜索熱詞ThinkPHP的數據庫條件查詢語句有字符串式&#xff0c;數組式書寫方法字符串式即是原生式&#xff0c;數組式查詢語句因書寫方式與特定字符的原因比較復雜&#xff0c;下面為大家例出了常用的ThinkPHP數組式查詢語句的使用方法ThinkPHP一般查詢$data_gt[id]array(gt,8);…

C++---漢明距離

兩個整數之間的漢明距離指的是這兩個數對應二進制位不同的位置的數目。 【輸入形式】 給出兩個整數x和y(0<x,y<2^31)&#xff0c;用空格分隔 【輸出形式】 輸出他們之間的漢明距離 【樣例輸出】 1 4 【樣例說明】 00000000 00000000 00000000 00000001 00000000 00000000…

Opencv基礎畫圖函數——line、circle、rectangle、Rect、ellipse、polylines、putText函數的用法

目錄1、line函數2、circle函數3、rectangle、Rect函數4、ellipse函數5、polylines函數6、隨機初始化顏色7、putText函數總結1、line函數 line(img,(0,0),(511,511),(255,0,0),5)這個函數有5個參數&#xff0c;img是圖像名稱&#xff0c;起點坐標&#xff0c;終點坐標&#xff…

GCC 里面的一些命令

記錄一下常用GCC 相關的命令和參數 ldd ---> print share library dependenciy LD_LIBRARY_PATH---> environment variable, it will search the path accord to this variable. Also check the ldd to verify this environmental variable ldconfig-----> configure…

理解關聯容器“map”的關鍵點

map有一個構造函數: map<k, v> m(b, e); 《C Primer》解釋為&#xff1a;“創建 map 類型的對象 m&#xff0c; 存儲迭代器 b 和 e 標記的范圍內所有元素的副本&#xff0c;元素的類型必須能轉換為 pair<const k, v>”&#xff0c;這個構造函數理解起來沒有另外兩個…

c語言中圖形驅動程序功能_C / C ++中的圖形:一些更有趣的功能

c語言中圖形驅動程序功能In this Advance Learning Tutorial of C / C today, we are going to tell you about some of the functions that can be used to make the program more attractive. This works on both text and graphics modes. That is why knowing these funct…