傅立葉變換前后的能量守恒問題
在通信系統(tǒng)的仿真中,我們經(jīng)常需要根據(jù)給定的信噪比(SNR: Signal Noise Ratio),為傳輸?shù)臄?shù)據(jù)加上"加性高斯白噪聲(Additive Guassian White Noise)"。但是,傳輸前的數(shù)據(jù),很多時候考慮的是頻域的相位,給定的待傳輸?shù)臄?shù)據(jù)需要經(jīng)過傅立葉反變換到時域,在時域增加噪聲,然后送給接收模塊做性能評估。
(錄制的視頻:https://www.bilibili.com/video/BV1kP411V7hq/)
問題在于:無論是 Matlab 上,還是 Python 的 numpy 庫中,快速傅立葉變換和反變換,在變換的前后,都沒有保持能量守恒,這為定量地增加噪聲制造了一點小困難。本文試圖通過簡單的 QPSK 為例子,頻域分成 64 個頻點,經(jīng)過 ifft (快速傅立葉反變換)變到時域,然后定量地分析能量的變化情況.
頻域有 64 個頻點,我們在第二個頻點上發(fā)送一個信號,幅度為 1,相位為 ,這個信號可以表示為
. 按照直觀的理解,我們發(fā)送的信號是:
可以展開為:
可以很容易地看到,實部的最大值是 1.? 那么上面這個信號的功率,就是其模的平方,可以很容易看到,模的平方就是 1, 則其功率是 1.
我們來看一下用 ifft 之后的結(jié)果,64 個頻點上只有第二個頻點上有信號,其它頻點上沒有信
號,即是 0:
總計 64 個.
用下面的 python 代碼來做 ifft:
畫出來的圖形如下:

可以看到,幅度的最大值不是 1,程序中打印出來的最大值為 0.015625 ! 為什么呢?我們來觀察一下 ifft 的公式:
其中 $N$ 是傅立葉反變換的長度。這個例子中,N=64.
在這個例子中,由于只有 ,其它都是 0,上面公式中的求和項,就退化為之后 k=1參與了運算:
公式 2 與 公式 1 比較,則可以看到,公式二 多了一個? ,從圖中也可以看到,最高幅值是
.
討論到這里,似乎問題已經(jīng)解決了,但是,仔細(xì)看看, ifft 變換后幅度變?yōu)樵瓉碓O(shè)想的 64 分之一,那能量在轉(zhuǎn)換前和轉(zhuǎn)換后,是否保持一致呢?我們需要的是保持一致。
我們先從頻域看,64 個頻域信號的總能量,是每個頻率點上能量的和,即:,這個能量是在一個 fft 對應(yīng)的時間上的,即 64 個采樣點內(nèi)的。則換算成功率,在頻域看到的功率為 :
我們只分析一個頻點,k=1,在頻域看,其能量為 1,這是 k=1這個頻率在一個fft對應(yīng)時間內(nèi)的能量。
?現(xiàn)在看matlab 和 python numpy 庫中 ifft 的變換公式:
那么,k=1 對應(yīng)的波形是:
那么,我們在 64個樣點內(nèi)計算一下能量:
可以看到,頻域的能量是 1,而時域的能量是 ,能量相差了 64 倍!
所以, ifft 變換,會導(dǎo)致能量降為轉(zhuǎn)換前的 64 分之一。同理,可以證明, fft 變換,會導(dǎo)致能量放大為變換前的64倍。
如果我們把傅立葉變換對的公式,稍微改變一下放大或者縮小的倍數(shù),則可以保證轉(zhuǎn)換前后的能量保持一致,即能量守恒:
FFT 變換:
IFFT 變換
使用上面修改過的公式,則可以保證能量前后保持一致。
有時候,我們不僅關(guān)心能量保持一致,還要關(guān)心這個信號的能量大小,例如我們?yōu)榱思尤胍欢ㄐ旁氡?SNR 的高斯白噪聲,需要知道信號的功率大小。
注意:后面討論的能量大小,功率大小,都是基于修改后的傅立葉變換的公式,即保證變換前后能量保持一致的。
在頻域看,一個頻率點的信號,假設(shè)其能量為 1 (一般情況下,例如 QPSK 調(diào)制,都是保持能量為 1 的),因為傅立葉反變換后,對應(yīng)到 N 個采樣點的時間,因此,其功率為: .
?
在時域看,其對應(yīng)的波形為 :
其能量為(注意:為了與頻域保持一致,要注意求和的時間范圍是 N 個采樣點):
其功率則為 .
那么,如果在頻域上,只有一個頻率點上有信號,且頻域? 等于 1,則信號的功率就是
, 則可以根據(jù) SNR 的公式,計算出來需要的噪聲的功率。如果 N 個頻點上,都有信號,且頻域?
等于 1,則其功率就是 1.
總結(jié)一下:本文的核心,是提醒注意用標(biāo)準(zhǔn)庫中的 FFT/IFFT 函數(shù)時,存在能量在變換前后不守恒的問題。
延伸閱讀:
??? 把傅立葉變換和反變換,看成是線性空間的向量,在坐標(biāo)軸上的坐標(biāo),坐標(biāo)軸就是線性空間的基,這些基的要求,除了要求任何兩個不相同的基之間是正交的,還需要每個基向量的長度為1.
??? 傅立葉變換中的 ? 構(gòu)成一個合格的基向量,而
不是一個基向量,因為其長度是
.

我們來看一下傅里葉變換中基里面的各個向量(按照正確的方式來列舉的):
第一個向量:
k=0
第二個向量:
k=1
第三個向量:
k=2
。。。。
第 k+1 個向量:
k=k
.....
第 N 個向量:
k=N-1
每個基的模長都為 1:
如果用 matlab 中 傅立葉變換的公式,一個向量是:
則其模長為 N:
這就不是單位向量了。
======= 感謝閱讀到此處:
塑料垃圾危害多,至少不能讓塑料垃圾流進(jìn)河
