Matlab | Matlab從入門到放棄(15)——傅里葉變換

博主github:https://github.com/MichaelBeechan
博主CSDN:https://blog.csdn.net/u011344545
代碼下載:https://github.com/MichaelBeechan/Matlab-From-Zero-To-One

%% Time:2019.6.16
%% Function:傅里葉變換

傅里葉變換是將按時間或空間採樣的信號與按頻率採樣的相同信號進行關聯的數學公式。在信號處理中,傅里葉變換可以揭示信號的重要特徵(即其頻率分量)。
在這裏插入圖片描述
MATLAB中的 fft 函數使用快速傅里葉變換算法來計算數據的傅里葉變換。以正弦信號 x 爲例,該信號是時間 t 的函數,頻率分量爲 15 Hz 和 20 Hz。使用在 10 秒週期內以1/50秒爲增量進行採樣的時間向量。

t = 0:1/50:10-1/50;                     
x = sin(2*pi*15*t) + sin(2*pi*20*t);
plot(t,x)

在這裏插入圖片描述

% 計算信號的傅里葉變換,並在頻率空間創建對應於信號採樣的向量 f
y = fft(x);
f = (0 : length(y) - 1) * 50 / length(y);

plot(f, abs(y))
title('Magnitude')

在這裏插入圖片描述

% 該變換還會生成尖峯的鏡像副本,該副本對應於信號的負頻率。
% 爲了更好地以可視化方式呈現週期性,您可以使用fftshift函數對變換執行以零爲中心的循環平移。
n = length(x);
fshift = (-n/2 : n/2 - 1) * (50/n);
yshift = fftshift(y);
plot(fshift, abs(yshift))

在這裏插入圖片描述

噪聲信號

%% 噪聲信號
% 在科學應用中,信號經常遭到隨機噪聲破壞,掩蓋其頻率分量
% 傅里葉變換可以清除隨機噪聲並顯現頻率
% 通過在原始信號 x 中注入高斯噪聲,創建一個新信號 xnoise
xnoise = x + 2.5 * gallery('normaldata', size(t), 4);
ynoise = fft(xnoise);
ynoiseshift = fftshift(ynoise);
power = abs(ynoiseshift).^2/n;
plot(fshift, power)
title('Power')

在這裏插入圖片描述

計算效率

在這裏插入圖片描述
以加利福尼亞海岸的水下麥克風所收集的音頻數據爲例。在康奈爾大學生物聲學研究項目維護的庫中可以找到這些數據。載入包含太平洋藍鯨鳴聲的文件 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);

plot(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);
% 繪製信號的功率頻譜
f = (0 : n-1) * (fs / n) / 10; % frequency vector
power = abs(y).^2 / n;   % power spectrum      
plot(f(1 : floor(n / 2)), power(1 : floor(n / 2)))
xlabel('Frequency')
ylabel('Power')

在這裏插入圖片描述

發佈了125 篇原創文章 · 獲贊 113 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章