Matlab快速傅利葉變換程式(FFT)編寫

2021-08-30 09:09:47 字數 2281 閱讀 8041

最近在學習數字訊號處理,正好到快速傅利葉變換,寫乙個基於基2fft演算法的傅利葉變換。利用原理:dit-fft(時域抽取法基2fft)。

dit-fft:

設序列x(n)的長度為n,且滿足n=2^m,m為自然數。

①按n的奇偶把x(n)分解為兩個n/2的子串行。

②對x(n)做dft,經過化簡可以得到

x(k)=x1(k)+w^k;

x(k+n/2)=x1(k)+w^kx2(k);

k=0,1,…,n/2-1;

由此得到乙個蝶形運算符號:

③這是dit-fft基本原理,按照n值的大小,還可進一步進行分解運算,可分解m次,將n點dft分解為n個1點dft和m級蝶形運算,而1點dft就是時域序列本身。

dft與fft運算量比較:

n點dft:複數乘法cm=nn

複數加法ca=n(n-1)

n點fft: 複數乘法cm=mn/2

複數加法ca=mn

n=2^m

**:

function h=ditfft2(xn,m)

%dit-fft快速傅利葉變換程式

%程式名稱:ditfft

b=length(xn); %調整補零

if(b<2^m)

xn=[xn,zeros(1,(2^m)-b)];

endb=length(xn); %補零後xn長度

a=zeros(1,b); %xn轉換陣列

n=2^m; %計算點數

nxd=bin2dec(fliplr(dec2bin([1:n]-1,m)))+1;%倒序排列序號

xn=xn(nxd); %倒序xn

for i=1:n %n個1點dft,xn本身,賦值到陣列a

a(i)=xn(i);

endfor l = 1:m %dit-fft變換,m級蝶形變換

b = 2^(l-1); %兩個輸入資料距離

for j = 0:b-1; %旋轉因子處理

p=2^(m-l)*j;

for k=(j+1):2^l:n; %本次蝶形運算跨越時間

w=exp(-j*2*pi*p/n); %對應旋轉因子

t=a(k)+a(k+b)*w; %進行蝶形運算

a(k+b)=a(k)-a(k+b)*w;

a(k)=t;

endend

endh=a; %輸出h為a

測試**:

%測試程式

clear; %清屏

clc;

xn=[1 1 1 1]; %要轉換的序列

m=5; %轉換級數

b=fft(xn,32); %matlab內建fft變換,用於對比

subplot(2,1,1); %內建fft變換影象

[a1,b1]=size(b);

o1=1:b1; %內建fft變換座標

stem(o1,abs(b),'.'); %繪圖

h=ditfft2(xn,m); %手工編寫ditfft2函式

subplot(2,1,2); %繪製手工編寫的fft影象

[a1,b2]=size(h);

o2=1:b2; %ditfft2變換座標

stem(o2,abs(h),'.') %繪圖

執行結果:

參考:《數字訊號處理第四版》高西全 丁玉美

Matlab做快速傅利葉變換

快速傅利葉變換 fast fourier transform 是訊號處理與資料分析領域裡最重要的演算法之一。傅利葉變換在物理學 數論 組合數學 訊號處理 概率 統計 密碼學 聲學 光學等領域都有著廣泛的應用。那麼如何用matlab實現快速傅利葉變換呢?直接上 tp 0 2048 時域資料點數n yt...

快速傅利葉變換 及MATLAB函式

快速傅利葉變換實用程式 include include include define pi 3.1415926 typedef struct complexnumber cnumber void quickfft cnumber p,int n,int k,cnumber f,int l,int i...

matlab 傅利葉變換

兩幅影象傅利葉變換後相加 f1 imread rice.tif 讀圖一f2 imread circles.tif 讀圖二f1 fft2 double f1 對圖一進行傅利葉變換 f2 fft2 double f2 對圖二進行傅利葉變換 f f1 f2 兩幅圖在頻率域融合 f ifft2 f 對f 反...