在不同形式傅里葉變換形式下,Fourier變換對的形式調整方法

我在做大渦模擬(LES)的時候,需要繪製各向同性湍流的三維能譜,並且對高波數的成分進行濾波。

就在我比較採用不同形式的卷積核進行濾波,對能譜的影響的時候,我正想把盒子濾波(heaviside函數)的Fourier轉化後的形式運用到譜空間。但是我發現,sagaut中的公式是不可以直接拿來用的,需要對卷積核的寬度進行一些修正,我不斷調整核寬度的大小,然後與標準答案對比了一下,發現係數正好相差一個2\pi/N,於是我就有了以下思考,並進行了驗證。

總的來說,就是歸因於Fourier變換的形式不統一,即matlab的fft變換的形式與sagaut的連續傅里葉變換形式的不統一。

兩種Fourier變換

一本參考書中的Fourier變換

Pope在《turbulent flow》的Appendix D中,對Fourier變換的定義如下:

g(\omega)=\mathcal{F}_p \{f(t)\}=\frac{1}{2 \pi} \int_{-\infty}^{\infty}f(t) e^{-j \omega t}dt,

其逆變換如下:

f(t)=\mathcal{F}_p^{-1}\{g(\omega)\}=\int_{-\infty}^{\infty}g(w)e^{j\omega t} d \omega.

採用以上Fourier變換的定義時,Heaviside函數的Fourier變換如下:

\mathcal{F}p\{ H(b-\mid t\mid)\}=\frac{\text{sin}(b \omega)}{\pi \omega}.

某語言的FFT幫助函數中定義的離散傅里葉變換

而matlab 中fft(X)函數關於Fourier變換及其逆變換的定義如下:

g(k)=\mathcal{F}_M\{f(n)\}=\sum_{n=1}^N f(n) e^{-j2\pi k n/N},k \in [1,N],

f(n)=\mathcal{F}^{-1}_M\{g(k)\}=\frac{1}{N} \sum_{k=1}^N g(k)e^{j2\pi k n/N}, n \in [1,N].

有兩點需要注意的是

  • 爲了比較的方便,我把指數上的(k-1)*(n-1)替換成了kn,僅僅是爲了這個問題的討論方便。
  • 爲了方便區分,我在前一種定義下采用自變量\omegat,Fourier變換採用\mathcal{F}_p表示,後一種定義採用自變量k與自變量n,Fourier變換採用\mathcal{F}_M表示。

如何將前者定義下的Fourier變換對應用到matlab中?

現在需要討論的就是如何進行\omega,t$ to $ k,n的變換,即在調用matlab的函數的時候k與n是如何對應的。

從指數函數的指數來看,兩者的指數是肯定相同的,如果假設

                                                              {\color{Red} t=n, n\in [1,N]}

的話,很明顯有

                                                          {\color{Red} \omega =2 \pi k/N, k \in [1,N]}

因此本文章的主要結論就講完了,突然覺得有點簡單。恩,下面是一些補充。

那麼在matlab函數中,heviside函數的Fourier變換的形式是怎樣的?

下面這個就是推導。

{\color{Red} \mathcal{F}_M\{H(b-\mid n\mid)\} =\sum_{n=1}^N f(n) e^{-j2\pi k n/N}=2\pi (\frac{1}{2\pi}\sum_{n=1}^N f(n) e^{-j(2\pi k/N) n})\\ =2 \pi \mathcal{F}p\{ H(b-\mid n\mid)\} =2 \pi \frac{\text{sin}(k \omega)}{\pi \omega}=\frac{\text{sin}( 2 \pi bk/N)}{ \pi k/N}, where \; k,n \in [1,N]. }

紅色爲主要結論。

注意:本文章不討論連續Fourier變換與離散Fourier變換之間的關係,我默認兩者是近似相等的,即積分號可以變成求和。

一個用於驗證的一維Fourier變換算例

在這個算例中,我採用matlab自帶的fft函數對b=5的heaviside函數進行Fourier變換,然後將其高波數成分重疊到低波數成分(因爲奈奎斯特採樣與奈奎斯特頻率)。

關於實數函數的Fourier分解的係數的模

由於變換之後是一個複數向量,但是連續Fourier變換的理論分析結果是一個實數函數,我猜測這是因爲離散Fourier函數忽略了高波數成分。

於是我就想將複數向量的模與連續Fourier變換的結果係數的模進行比較。

關於模,有以下推導及定義。

假設有一個函數u(t),它可以Fourier分解,分解成不同的頻率,每個頻率的係數爲c_k,其分解如下:

u(t)= \sum_{k=-\infty}^\infty (a_k+j b_k)e^{j \omega_k t}= \sum_{k=-\infty}^\infty c_k e^{j \omega_k t}.

由於我們不關心相位,平均值之類的東西,所以我們可以簡單的取其平均值爲0,即c_0=0

將其餘成分按照sin與cos進行拆分組合如下:

u(t) &= \sum_{k=1}^\infty[(a_k+a_{-k})+j(b_k+b_{-k})]\text{cos}(\omega_k t)\\ &+\sum_{k=1}^\infty[j(a_k-a_{-k})+(b_k-b_{-k})]\text{sin}(\omega_k t)

我們只討論u(t)是一個實數的情況,於是上式的虛部爲0,所以它的係數是共軛的,即a_n=a_{-n},b_n=-b_{-n}

於是通過簡單的變換,我們就可以進行以下簡化,

u(t) &= 2\sum_{k=1}^\infty [a_k\text{cos}(\omega_k t)-b_{k}\text{sin}(\omega_k t)]\\ &=2\sum_{k=1}^\infty \mid c_k \mid \text{cos}(\omega_k t+ \theta_k)

其中,\mid c_k \mid =(a_k^2+b_k^2)^{1/2}c_k的模。

通過這一段的分析,我想要說明,Fourier變換之後的函數的模與其波數仍然是具有一一對應的關係,不會因爲取模之後,某一個波數的對應值就會對其他的波數造成影響。因此,通過比較模來比較兩種Fourier變換定義下的變換結果是有意義的。

計算結果

因爲連續Fourier變換隻有實數成分,所以只需要取其絕對值就好,但是又因爲fft的結果高於奈奎斯特採樣頻率的部分被重疊到了低波數成分,所以連續Fourier變換的結果取絕對值之後還要乘以2。與此章的上一節分析有異曲同工之妙。

現實空間的heaviside函數的圖像如下所示。

譜空間的模關於波數的函數如下所示。

從圖中可以看出,兩者結果是很相近的,唯一的區別是,在較高的波數時,fft結果模偏大,猜測這可能是因爲fft只能對有限波數進行計算,並不能在無限域中進行Fourier變換,所以更高波數的影響被累積到這些波數中。

兩者進行比較的代碼如下:

clc;clear;close all;
N=128;
n=1:N;
b=5;
%生成heaviside函數
data=(n<=(10+2*b-1)) & (n>=(10));
data_fft=fft(data);
figure;plot(data,'.-')
xlabel('n')
ylabel(strcat('heaviside (b=',num2str(b),')'))
saveas(gcf,'test_real.eps')
%fft變換後的波數摺疊
data_fft=[2*data_fft(2:(N/2)) data_fft(N/2+1)];
%求fft的模
data_mod=sqrt(data_fft.*conj(data_fft));
figure;plot(data_mod,'b+-')

k=1:(N/2);
% b=5;
y=sin(2*pi*b*k/N)./(pi*k/N);
%求模與摺疊
y=2*abs(y);
hold on;plot(k,y,'ro-')
xlabel('wave number k')
ylabel('|c_n|')
legend('fft results','theoretical results')
saveas(gcf,'test_fourier.eps')

 

發佈了4 篇原創文章 · 獲贊 3 · 訪問量 1671
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章