我在做大渦模擬(LES)的時候,需要繪製各向同性湍流的三維能譜,並且對高波數的成分進行濾波。
就在我比較採用不同形式的卷積核進行濾波,對能譜的影響的時候,我正想把盒子濾波(heaviside函數)的Fourier轉化後的形式運用到譜空間。但是我發現,sagaut中的公式是不可以直接拿來用的,需要對卷積核的寬度進行一些修正,我不斷調整核寬度的大小,然後與標準答案對比了一下,發現係數正好相差一個,於是我就有了以下思考,並進行了驗證。
總的來說,就是歸因於Fourier變換的形式不統一,即matlab的fft變換的形式與sagaut的連續傅里葉變換形式的不統一。
兩種Fourier變換
一本參考書中的Fourier變換
Pope在《turbulent flow》的Appendix D中,對Fourier變換的定義如下:
其逆變換如下:
採用以上Fourier變換的定義時,Heaviside函數的Fourier變換如下:
某語言的FFT幫助函數中定義的離散傅里葉變換
而matlab 中fft(X)函數關於Fourier變換及其逆變換的定義如下:
有兩點需要注意的是
- 爲了比較的方便,我把指數上的(k-1)*(n-1)替換成了kn,僅僅是爲了這個問題的討論方便。
- 爲了方便區分,我在前一種定義下采用自變量與,Fourier變換採用表示,後一種定義採用自變量與自變量,Fourier變換採用表示。
如何將前者定義下的Fourier變換對應用到matlab中?
現在需要討論的就是如何進行的變換,即在調用matlab的函數的時候k與n是如何對應的。
從指數函數的指數來看,兩者的指數是肯定相同的,如果假設
的話,很明顯有
,
因此本文章的主要結論就講完了,突然覺得有點簡單。恩,下面是一些補充。
那麼在matlab函數中,heviside函數的Fourier變換的形式是怎樣的?
下面這個就是推導。
紅色爲主要結論。
注意:本文章不討論連續Fourier變換與離散Fourier變換之間的關係,我默認兩者是近似相等的,即積分號可以變成求和。
一個用於驗證的一維Fourier變換算例
在這個算例中,我採用matlab自帶的fft函數對b=5的heaviside函數進行Fourier變換,然後將其高波數成分重疊到低波數成分(因爲奈奎斯特採樣與奈奎斯特頻率)。
關於實數函數的Fourier分解的係數的模
由於變換之後是一個複數向量,但是連續Fourier變換的理論分析結果是一個實數函數,我猜測這是因爲離散Fourier函數忽略了高波數成分。
於是我就想將複數向量的模與連續Fourier變換的結果係數的模進行比較。
關於模,有以下推導及定義。
假設有一個函數,它可以Fourier分解,分解成不同的頻率,每個頻率的係數爲,其分解如下:
由於我們不關心相位,平均值之類的東西,所以我們可以簡單的取其平均值爲0,即。
將其餘成分按照sin與cos進行拆分組合如下:
我們只討論是一個實數的情況,於是上式的虛部爲0,所以它的係數是共軛的,即。
於是通過簡單的變換,我們就可以進行以下簡化,
其中,是的模。
通過這一段的分析,我想要說明,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')