傅立葉變換是將按時間或空間採樣的信號與按頻率採樣的相同信號進行關聯的數學公式。在信號處理中,傅立葉變換可以揭示信號的重要特徵(即其頻率分量)。
對於包含 n 個均勻採樣點的向量 x,其傅立葉變換定義為
ω=e−2πi/n 是 n 個復單位根之一,其中 i 是虛數單位。對於 x 和 y,索引 j 和 k 的範圍為 0 到 n−1。
MATLAB中的 fft 函數使用快速傅立葉變換算法來計算數據的傅立葉變換。以正弦信號 x 為例,該信號是時間 t 的函數,頻率分量為 15 Hz 和 20 Hz。使用在 10 秒周期內以 150 秒為增量進行採樣的時間向量。
t = 0:1/50:10-1/50; x = sin(2*pi*15*t) + sin(2*pi*20*t);figureplot(t,x)計算信號的傅立葉變換,並在頻率空間創建對應於信號採樣的向量 f。
y = fft(x); f = (0:length(y)-1)*50/length(y);以頻率函數形式繪製信號幅值時,幅值尖峰對應於信號的 15 Hz 和 20 Hz 頻率分量。
figureplot(f,abs(y))title('Magnitude')該變換還會生成尖峰的鏡像,對應於信號的負頻率。為了更好地以可視化方式呈現周期性,使用 fftshift 函數對變換執行以零為中心的循環平移。
n = length(x); fshift = (-n/2:n/2-1)*(50/n);yshift = fftshift(y);figureplot(fshift,abs(yshift))含噪信號在科學應用中,信號經常遭到隨機噪聲破壞,掩蓋其頻率分量。傅立葉變換可以清除隨機噪聲並顯現頻率。例如,通過在原始信號 x 中注入高斯噪聲,創建一個新信號 xnoise。
rng('default')xnoise = x + 2.5*randn(size(t));頻率函數形式的信號功率是信號處理中的一種常用度量。功率是信號的傅立葉變換按頻率樣本數進行歸一化後的平方幅值。計算並繪製以零頻率為中心的含噪信號的功率譜。儘管存在噪聲,仍可以根據功率中的尖峰辨識出信號的頻率。
ynoise = fft(xnoise);ynoiseshift = fftshift(ynoise); power = abs(ynoiseshift).^2/n; figureplot(fshift,power)title('Power')計算效率
直接使用傅立葉變換公式分別計算 y 的 n 個元素需要 n平方 數量級的浮點運算。使用快速傅立葉變換算法,則只需要 nlogn 數量級的運算。在處理包含成百上千萬個數據點的數據時,這一計算效率會帶來很大的優勢。在 n 為 2 的冪時,許多專門的快速傅立葉變換實現可進一步提高效率。
以加利福尼亞海岸的水下麥克風所收集的音頻數據為例。在康奈爾大學生物聲學研究項目維護的庫中可以找到這些數據。載入包含太平洋藍鯨鳴聲的文件 bluewhale.au,並對其中一部分數據進行格式化。可使用命令 sound(x,fs) 來收聽完整的音頻文件。
whaleFile = 'bluewhale.au';[x,fs] = audioread(whaleFile);whaleMoan = x(2.45e4:3.10e4);t = 10*(0:1/fs:(length(whaleMoan)-1)/fs);figureplot(t,whaleMoan)xlabel('Time (seconds)')ylabel('Amplitude')xlim([0 t(end)])指定新的信號長度,該長度是大於原始長度的最鄰近的 2 的冪。然後使用 fft 和新的信號長度計算傅立葉變換。fft 會自動用零填充數據,以增加樣本大小。此填充操作可以大幅提高變換計算的速度,對於具有較大質因數的樣本大小更是如此。
m = length(whaleMoan); n = pow2(nextpow2(m));y = fft(whaleMoan,n);繪製信號的功率譜。繪圖指示,鳴聲包含約 17 Hz 的基本頻率和一系列諧波(其中強調了第二個諧波)。
f = (0:n-1)*(fs/n)/10; % frequency vectorpower = abs(y).^2/n; % power spectrum figureplot(f(1:floor(n/2)),power(1:floor(n/2)))xlabel('Frequency')ylabel('Power')