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

2021-10-11 06:08:47 字數 1651 閱讀 9045

(歡迎指正)

matlab 編寫快速傅利葉反變換函式(ifft)(橫向讀取資料進行變換)

matlab**:

%快速傅利葉逆變換,不夠2的整數冪的個數,末尾自動補齊0

function ret_val = myifft(vector)

%因為輸入的資料可能不是2的整數次冪,補零使得計算更加方便

[m,n]=size(vector);%輸入訊號矩陣大小

num=ceil(log2(n));%向上取整

n=2^num;

vector=zeros(m,n);%申請足夠大小矩陣

vector(:,1:n)=vector(:,:);%將變換後的訊號輸入,不足補零

for lines=1:m%迴圈行數

for l=num-1:-1:0%l表示運算等級或者層數

dis=2^l;%dis表示奇偶組之間的距離

for id=1:2^(num-l-1) %迴圈當前層陣列數

%進行同址運算

for idx=1:dis%迴圈組內個數

x1=(id-1)*2*dis+idx;%求得奇數陣列的索引值

x2=(id-1)*2*dis+dis+idx;%對應偶數陣列的索引值

temp1=(vector(lines,x1)+vector(lines,x2))/2;%中間變數儲存相應奇偶陣列資料

temp2=(vector(lines,x1)-vector(lines,x2))/2*w(l,(x1-1));

vector(lines,x1)=temp1;%存入之前位址

vector(lines,x2)=temp2;

endend

endend%變址運算,逆推回原來位置

for line=1:m%迴圈行數

j1 = 0;

for i = 1 : n%迴圈個數

if i < j1 + 1

tmp = vector(line,j1 + 1);

vector(line,j1 + 1) = vector(line,i);

vector(line,i) =tmp;

endk = n / 2;

while k <= j1

j1 = j1 - k;

k = k / 2;

endj1 = j1 + k;

endendret_val =vector;

function val=w(l,x)%旋轉因子當層數為l,索引值為x

val=exp(1j*2*pi*x/2^(l+1));

endend

輸入傅利葉變換後的結果進行反變換*

反變換結果截圖

右邊影象右下黑框是fft變換過程中補零部分

當然也可以去除黑邊框:

說明:函式是對輸入資料進行一維橫向fft,對於遙感影象要進行二維變換,才能獲得如圖效果。

快速傅利葉

參考 ae 97 e6 b3 95 e5 ad a6 e4 b9 a0 e7 ac 94 e8 ae b0 hdu大整數乘法 include include include include include using namespace std const double pi acos 1.0 複數...

sin傅利葉變換公式 Matlab與傅利葉變換

今天,二狗給大家講一講matlab實現傅利葉變換。大家都知道,訊號分為兩種,確定訊號和不確定訊號。在確定訊號中,有兩個非常重要的類別,時域分析和頻域分析。而將兩者充分結合的,就是我們今天要講的傅利葉變換。絕大多數工科狗在大一或者大二的時候,都或多或少接觸過傅利葉變換。二狗也不例外。當初二狗學 復變函...

快速傅利葉(FFT)

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