理解離散傅立葉變換(二. 實數形式離散傅立葉變換)

轉載原文鏈接
https://blog.csdn.net/dznlong/article/details/2269827

理解離散傅立葉變換(二)
                                ------實數形式離散傅立葉變換(Real DFT)
       上一節我們看到了一個實數形式離散傅立葉變換的例子,通過這個例子能夠讓我們先對傅立葉變換有一個較爲形象的感性認識,現在就讓我們來看看實數形式離散傅立葉變換的正向和逆向是怎麼進行變換的。在此,我們先來看一下頻率的多種表示方法。
 
一、          頻域中關於頻率的四種表示方法
 
1、序號表示方法,根據時域中信號的樣本數取0 ~ N/2,用這種方法在程序中使用起來可以更直接地取得每種頻率的幅度值,因爲頻率值跟數組的序號是一一對應的: X[k],取值範圍是0 ~ N/2;
2、分數表示方法,根據時域中信號的樣本數的比例值取0 ~ 0.5: X[ƒ],ƒ = k/N,取值範圍是0 ~ 1/2;
3、用弧度值來表示,把ƒ乘以一個2π得到一個弧度值,這種表示方法叫做自然頻率(natural frequency):X[ω],ω = 2πƒ = 2πk/N,取值範圍是0 ~ π;
4、以赫茲(Hz)爲單位來表示,這個一般是應用於一些特殊應用,如取樣率爲10 kHz表示每秒有10,000個樣本數:取值範圍是0到取樣率的一半。
 
二、          DFT基本函數
 
ck[i] = cos(2πki/N)
sk[i] = sin(2πki/N)
    其中k表示每個正餘弦波的頻率,如爲2表示在0到N長度中存在兩個完整的週期,10即有10個週期,如下圖:
       上圖中至於每個波的振幅(amplitude)值(Re X[k],Im X[k])是怎麼算出來的,這個是DFT的核心,也是最難理解的部分,我們先來看看如何把分解出來的正餘弦波合成原始信號(Inverse DFT)。
 
三、        合成運算方法(Real Inverse DFT)
 
DFT合成等式:
如果有學過傅立葉級數,對這個等式就會有似曾相識的感覺,不錯!這個等式跟傅立葉級數是非常相似的:
           當然,差別是肯定是存在的,因爲這兩個等式是在兩個不同條件下運用的,至於怎麼證明DFT合成公式,這個我想需要非常強的高等數學理論知識了,這是研究數學的人的工作,對於普通應用者就不需要如此的追根究底了,但是傅立葉級數是好理解的,我們起碼可以從傅立葉級數公式中看出DFT合成公式的合理性。
 
       DFT合成等式中的Im [k]和Re [k]跟Im X[k]和Re X[k]是不一樣的,下面是轉換方法:
      
       但k等於0和N/2時,實數部分的計算要用下面的等式:
             
       上面四個式中的N是時域中點的總數,k是從0到N/2的序號。
       爲什麼要這樣進行轉換呢?這個可以從頻譜密度(spectral density)得到理解,如下圖就是個頻譜圖:
      
       這是一個頻譜圖,橫座標表示頻率大小,縱座標表示振幅大小,原始信號長度爲N(這裏是32),經DFT轉換後得到的17個頻率的頻譜,頻譜密度表示每單位帶寬中爲多大的振幅,那麼帶寬是怎麼計算出來的呢?看上圖,除了頭尾兩個,其餘點的所佔的寬度是2/N,這個寬度便是每個點的帶寬,頭尾兩個點的帶寬是1/N,而Im X[k]和Re X[k]表示的是頻譜密度,即每一個單位帶寬的振幅大小,但Im [k]和Re [k]表示2/N(或1/N)帶寬的振幅大小,所以Im [k]和Re [k]分別應當是Im X[k]和Re X[k]的2/N(或1/N)。
 
頻譜密度就象物理中物質密度,原始信號中的每一個點就象是一個混合物,這個混合物是由不同密度的物質組成的,混合物中含有的每種物質的質量是一樣的,除了最大和最小兩個密度的物質外,這樣我們只要把每種物質的密度加起來就可以得到該混合物的密度了,又該混合物的質量是單位質量,所以得到的密度值跟該混合物的質量值是一樣的。
 
       至於爲什麼虛數部分是負數,這是爲了跟複數DFT保持一致,這個我們將在後面會知道這是數學計算上的需要(Im X[k]計算時加上了一個負號,Im [k]再加上負號,結果便是正的,等於沒有變化)。
 
       如果已經得到了DFT結果,這時要進行逆轉換,即合成原始信號,則可按如下步驟進行轉換:
1、先根據上面四個式子計算得出Im [k]和Re [k]的值;
2、再根據DFT合成等式得到原始信號數據。
下面是用BASIC語言來實現的轉換源代碼:
100 ‘DFT逆轉換方法
110 ‘/XX[]數組存儲計算結果(時域中的原始信號)
120 ‘/REX[]數組存儲頻域中的實數分量,IMX[]爲虛分量
130 ‘
140 DIM XX[511]
150 DIM REX[256]
160 DIM IMX[256]
170 ‘
180 PI = 3.14159265
190 N% = 512
200 ‘
210 GOSUB XXXX ‘轉到子函數去獲取REX[]和IMX[]數據
220 ‘
230 ‘
240 ‘
250 FOR K% = 0 TO 256
260   REX[K%] = REX[K%] / (N%/2)
270   IMX[K%] = -IMX[K%] / (N%/2)
280 NEXT k%
290 ‘
300 REX[0] = REX[0] / N
310 REX[256] = REX[256] / N
320 ‘
330 ‘ 初始化XX[]數組
340 FOR I% = 0 TO 511
350   XX[I%] = 0
360 NEXT I%
370 ‘
380 ‘
390 ‘
400 ‘
410 ‘
420 FOR K% =0 TO 256
430   FOR I%=0 TO 511
440 ‘
450      XX[I%] = XX[I%] + REX[K%] * COS(2 * PI * K% * I% / N%)
460      XX[I%] = XX[I%] + IMX[K%] * SIN(2 * PI * K% * I% / N%)
470 ‘
480   NEXT I%
490 NEXT K%
500 ‘
510 END
 
上面代碼中420至490換成如下形式也許更好理解,但結果都是一樣的:
420 FOR I% =0 TO 511
430   FOR K%=0 TO 256
440 ‘
450      XX[I%] = XX[I%] + REX[K%] * COS(2 * PI * K% * I% / N%)
460      XX[I%] = XX[I%] + IMX[K%] * SIN(2 * PI * K% * I% / N%)
470 ‘
480   NEXT I%
490 NEXT K%
 
四、        分解運算方法(DFT
 
有三種完全不同的方法進行DFT:一種方法是通過聯立方程進行求解, 從代數的角度看,要從N個已知值求N個未知值,需要N個聯立方程,且N個聯立方程必須是線性獨立的,但這是這種方法計算量非常的大且極其複雜,所以很少被採用;第二種方法是利用信號的相關性(correlation)進行計算,這個是我們後面將要介紹的方法;第三種方法是快速傅立葉變換(FFT),這是一個非常具有創造性和革命性的的方法,因爲它大大提高了運算速度,使得傅立葉變換能夠在計算機中被廣泛應用,但這種算法是根據複數形式的傅立葉變換來實現的,它把N個點的信號分解成長度爲N的頻域,這個跟我們現在所進行的實域DFT變換不一樣,而且這種方法也較難理解,這裏我們先不去理解,等先理解了複數DFT後,再來看一下FFT。有一點很重要,那就是這三種方法所得的變換結果是一樣的,經過實踐證明,當頻域長度爲32時,利用相關性方法進行計算效率最好,否則FFT算法效率較高。現在就讓我們來看一下相關性算法。
 
利用信號的相關性(correlation)可以從噪聲背景中檢測出已知的信號,我們也可以利用這個方法檢測信號波中是否含有某個頻率的信號波:把一個待檢測信號波乘以另一個信號波,得到一個新的信號波,再把這個新的信號波所有的點進行相加,從相加的結果就可以判斷出這兩個信號的相似程度。如下圖:
        上面a和 b兩個圖是待檢測信號波,圖a很明顯可以看出是個3個週期的正弦信號波,圖b的信號波則看不出是否含有正弦或餘弦信號,圖c和d都是個3個週期的正弦信號波,圖e和f分別是a、b兩圖跟c、d兩圖相乘後的結果,圖e所有點的平均值是0.5,說明信號a含有振幅爲1的正弦信號c,但圖f所有點的平均值是0,則說明信號b不含有信號d。這個就是通過信號相關性來檢測是否含有某個信號的方法。
 
       相應地,我也可以通過把輸入信號和每一種頻率的正餘弦信號進行相乘(關聯操作),從而得到原始信號與每種頻率的關聯程度(即總和大小),這個結果便是我們所要的傅立葉變換結果,下面兩個等式便是我們所要的計算方法:
      
       第二個式子中加了個負號,是爲了保持複數形式的一致,前面我們知道在計算Im [k]時又加了個負號,所以這只是個形式的問題,並沒有實際意義,你也可以把負號去掉,並在計算Im [k]時也不加負號。
 
       這裏有一點必須明白一個正交的概念:兩個函數相乘,如果結果中的每個點的總和爲0,則可認爲這兩個函數爲正交函數。要確保關聯性算法是正確的,則必須使得跟原始信號相乘的信號的函數形式是正交的,我們知道所有的正弦或餘弦函數是正交的,這一點我們可以通過簡單的高數知識就可以證明它,所以我們可以通過關聯的方法把原始信號分離出正餘弦信號。當然,其它的正交函數也是存在的,如:方波、三角波等形式的脈衝信號,所以原始信號也可被分解成這些信號,但這只是說可以這樣做,卻是沒有用的。
       下面是實域傅立葉變換的BASIC語言代碼:
 
       到此爲止,我們對傅立葉變換便有了感性的認識了吧。但要記住,這只是在實域上的離散傅立葉變換,其中雖然也用到了複數的形式,但那只是個替代的形式,並無實際意義,現實中一般使用的是複數形式的離散傅立葉變換,且快速傅立葉變換是根據複數離散傅立葉變換來設計算法的,在後面我們先來複習一下有關複數的內容,然後再在理解實域離散傅立葉變換的基礎上來理解複數形式的離散傅立葉變換。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章