傅立葉變換(FT, Fourier Transform)的作用是將一個信號由時域變換到頻域。其實就是把數據由橫坐標時間、縱坐標采樣值的波形圖格式,轉換為橫坐標頻率、縱坐標振幅(或相位)的頻譜格式。變換后可以很明顯地看出一些原先不易察覺的特征。 離散傅立葉變換(DFT)的算法屬於線性變換。由於對每個采樣點,都要做一次全部點的加權求和的運算,因此當采樣點比較多時,運算速度會很慢。 快速傅立葉變換(FFT)是DFT的快速算法,運算結果和DFT是相等的。其原理是利用權值的對稱性與周期性,把采樣點分解成兩份,每份的點數是原來的一半,這樣運算量也會減半。然后可以繼續分解為4份、8份、16份……以此不斷提升效率。
波形的公式:
采樣植(y) - 縱坐標軸代表采樣點的值
時間(t) - 橫坐標軸代表時間,或者代表當前是第幾個采樣點
振幅(A) - 也叫幅度,代表波的高度(峰值)
圓頻率(ω) - ω=2π*f,f代表頻率
相位(ω*t) - 是個角度,一般用弧度制表示,弧度制的0~2π,代表0度到360度
采樣點數量(N) - 采樣的數據是離散的,常常用散點來表示,下圖共有20個采樣點。
頻率(f) - 是單位時間內完成振動的次數,f=波的重復次數/N。
假如一個波的圖形為:采樣點數量(N)=200,振幅(A)=3,頻率為10個波,即3*sin(2π*10/200)。
經過傅立葉變換后,可以看到在大約10的位置有一條豎線,由此很容易看出,頻率為10個波。由於變換的結果是個對稱圖形,因此在右邊200-10的對應位置也會出現一條豎線。變換后的數據,除了這兩條豎線以外,其它值的都近似為0,是個稀疏矩陣。
運算結果是復數,輸出值取復數的模(絕對值)。復數的模 = 實部的平方+虛部的平方,再開平方 = sqrt(real^2+imagine^2)
如果只為提取特征的話,使用上面的輸出值就可以了。如果想得到標准的振幅和頻率值,那么:
振幅 = 輸出值/(N/2) = 300/(200/2) = 3
頻率 = 波的重復次數/N = 10/200 = 0.05
Matlab:
N = 200; % 采樣點數量
A = 3; % 振幅
fv = 10; % 波的重復次數
f = fv / 200; % 頻率
t = [1:200]; % 時間
y = A * sin(t*2*pi*f); % 生成波形采樣數據
plot(y); % 顯示時域圖
figure;
Y = fft(y, N); % FFT變換
plot(abs(Y)); % 顯示頻域圖
--------------------------------------------
傅立葉變換入門: http://news.cnblogs.com/n/209014/
FFT是基於復數運算的,而實際采樣點的數據一般是實數,因此要轉換成復數形式。標准的做法是復數的實數部分為采樣點的實數數據,虛數部分全部填0。(但這樣做會有一定運算效率的問題,因為填0的部分也參與運算,對此也有一些優化算法。)
N = 200; % 采樣點數量
A = 3; % 振幅
fv = 10; % 波的重復次數
f = fv / 200; % 頻率
t = [1:200]; % 時間
y = A * sin(t*2*pi*f); % 生成波形采樣數據
plot(y); % 顯示時域圖
figure;
Y = fft(y, N); % FFT變換
plot(abs(Y)); % 顯示頻域圖
--------------------------------------------
傅立葉變換入門: http://news.cnblogs.com/n/209014/
FFT是基於復數運算的,而實際采樣點的數據一般是實數,因此要轉換成復數形式。標准的做法是復數的實數部分為采樣點的實數數據,虛數部分全部填0。(但這樣做會有一定運算效率的問題,因為填0的部分也參與運算,對此也有一些優化算法。)