利用FFT 及 IFFT實現傅利葉正反變換

2021-06-01 23:16:59 字數 1987 閱讀 3869

貌似是很久沒有寫日誌了,前段時間一直很想寫關於矩陣特徵值在迭代演算法中的應用,也自己展望了一下可以從另乙個角度來分析turbo碼中的迭代演算法。但是,夢想都給人以美好的幻覺,現實逼迫你不得不踏實的做好手頭的工作,還是從最基本的最重要的傅利葉正反變換說起。

畢業設計貌似也跟**有關,所以重拾matlab來做一些小的**,先說說利用fft 和 ifft來實現傅利葉正反變換吧。看了很多資料,網上這方面的**我覺得都太凌亂,沒有把問題說清楚,有些直接就是錯誤的。下面分別以例子來說明:

例1:求在區間[-1,1]間的矩形訊號的傅利葉變換。

(1)利用抽樣產生離散時間

fs = 10;

ts = 1/fs;%時域抽樣間隔

t = [-5:ts:5];

x = zeros(size(t));

x(41) = 0.5;

x(42:60) = ones(1,19);

x(61) = 0.5;

%x = 2*sinc(2*t);

%繪製時域波形

subplot(211)

plot(t,x);

title('矩形波時域影象');

xlabel('t');

ylabel('x(t)時域大小');

(2)fft演算法實現(核心關鍵)

核心解釋:按ts的間隔(ts = 1/fs)對時間域抽樣n點並且做fft演算法後,得到的是對應與頻域[0,fs]間的n個值,頻率解析度為df = fs/n;同時我們知道fs其實對應著0頻率,fs/2對應著-fs/2即有乙個頻率反轉fftshift函式

n = 1024;%所做的fft點數,2的次冪能實現快速演算法

x = fft(x,n);%求得x(n)的dft結果

x = x/fs;%由於時域抽樣會有乙個 1/ts的衰減,所以必須乘以ts也即除以fs

df = fs/n;%頻率解析度

f = [0:df:df*(n-1)] - fs/2;%頻率倒轉

%繪製頻譜圖

subplot(212)

plot(f,fftshift(abs(x)));%把資料『迴圈倒轉』

title('傅利葉正變換');

xlabel('頻率')

結果如下:

注:由於時域取樣點較少,所以時域波形略有失真

例二:把上述矩形波傅利葉變換f(f) = 2*sinc(2f)用ifft實現傅利葉反變換,意思變換到矩形波時域影象。

(1)產生頻域抽樣波形

t = 10;%頻域取樣對應的時域 平移週期

fc = 1/t;%頻率抽樣間隔

ff = [-10:fc:10];%

f = 2*sinc(2*ff);%矩形波的頻譜

figure(2)

subplot(211)

plot(ff,f);

title('頻域取樣序列波形')

xlabel('f')

ylabel('頻率取樣大小')

(2)ifft演算法實現

核心:還是一樣,先進行ifft計算,然後實現時域倒轉,這裡要注意從頻域到fft有乙個尺度變換存在,即頻域抽樣點要乘以 頻域總寬度 題目中為10-(-10)= 20;

y = ifft(f*20);

dt = t/length(y);

tt = [0:dt:dt*(length(y)-1)] - t/2;

yef = ifftshift(abs(y));

%繪製頻域波形 對應的 時域波形

subplot(212)

plot(tt,(ifftshift(abs(y))));

title('傅利葉反變換')

xlabel('t')

結果如下:

其實,還有個問題,沒有解決,當增加ifft變換點數時,幅值會相應變換,還沒完全弄懂,主要是dsp忘得差不多了,趕緊補吧!晚安~

快速傅利葉(FFT)

快速傅利葉 更加形象的理解傅利葉變換 大概了解之後 從傅利葉級數到傅利葉變換 太大,只能裁剪為兩張 刨根問底的同學 雷德演算法 輸出序列是按自然順序排列的,而輸入序列的順序則是 位元反轉 方式排列的。也就是說,將序號用二進位制表示,然後將二進位制數以相反方向排列,再以這個數作為序號。如011變成11...

FFT快速傅利葉

description 給出兩個n位10進製整數x和y,你需要計算xy。input 第一行乙個正整數n。第二行描述乙個位數為n的正整數x。第三行描述乙個位數為n的正整數y output 輸出一行,即xy的結果。資料範圍 n 60000 乙個整數x a nan 1.a 0x a na a 0 x an...

matlab 快速傅利葉反變換函式(ifft)編寫

歡迎指正 matlab 編寫快速傅利葉反變換函式 ifft 橫向讀取資料進行變換 matlab 快速傅利葉逆變換,不夠2的整數冪的個數,末尾自動補齊0 function ret val myifft vector 因為輸入的資料可能不是2的整數次冪,補零使得計算更加方便 m,n size vecto...