Matlab實現傅立葉變換

2021-12-29 算法工程師的學習日誌

傅立葉變換是將按時間或空間採樣的信號與按頻率採樣的相同信號進行關聯的數學公式。在信號處理中,傅立葉變換可以揭示信號的重要特徵(即其頻率分量)。

對於包含 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')

相關焦點

  • 什麼是傅立葉變換,如何用MATLAB實現?
    第三場分享的主題是: 傅立葉變換的理解與MATLAB實現直播日期:2021年1月21日(周四)晚18點沒有傅立葉變換,就無法用數學的方法去處理現實世界中的各種各樣的信號。如今幾乎所有信息最終都會數位化,就會用到傅立葉變換及其變種,藉助傅立葉變換才能將信號識別為具體的成分,完成數位化。那麼現實世界中的各種信號如何通過通過數學模型來轉變成可以計算處理的數位訊號呢?
  • 快速傅立葉變換FFT在MATLAB中的實現
    首先,為什麼要進行傅立葉變換?將時域的信號變換到頻域的正弦信號,正弦比原信號更簡單,且正弦函數很早就被充分地研究,處理正弦信號比處理原信號更簡單。正弦信號的頻率保持性:輸入為正弦信號,輸出仍是正弦信號,幅度和相位可能發生變化,但頻率與原信號保持一致,只有正弦信號才擁有這樣的性質。
  • 在MATLAB中如何實現快速傅立葉變換
    首先,為什麼要進行傅立葉變換?
  • 使用 matlab 進行傅立葉分析和濾波
    clear allN=512;dt=0.02;n=0:N-1;t=n*dt;x=sin(2*pi*5*t)+0.5*sin(2*pi*10*t);%生成和信號%傅立葉變換m = floor(N/2)+1;a=zeros(1,m);b=zeros(1,m);for k=0:m-1 for ii=0:N-1
  • 可視化傅立葉變換:矩形波的傅立葉變換過程原理
    連續傅立葉變換採用輸入函數f(x)中的時域和把它變成一個全新功能的頻域中的函數F(ω),而傅立葉變換是專門用來解決非周期函數的,非周期函數通過傅立葉變換實現從時域到頻域的轉換,如下對矩形波進行傅立葉變換矩形波是一個比較簡單的周期函數,如下只有一個矩形,所以看作非周期函數,可對其進行傅立葉變換,我們已經很熟悉,矩形波的傅立葉變換圖形是sinc函數,即數學中的Sinx/x函數模型該函數在x=0時,sinc函數值等於1,如下圖
  • 形象易懂的傅立葉變換、短時傅立葉變換和小波變換
    下面我就按照傅立葉-->短時傅立葉變換-->小波變換的順序,講一下為什麼會出現小波這個東西、小波究竟是怎樣的思路。(反正題主要求的是通俗形象,沒說簡短,希望不會太長不看。。)一、傅立葉變換關於傅立葉變換的基本概念在此我就不再贅述了,默認大家現在正處在理解了傅立葉但還沒理解小波的道路上。(在第三節小波變換的地方我會再形象地講一下傅立葉變換)下面我們主要講傅立葉變換的不足。
  • matlab中的spectrogram函數對信號做短時傅立葉分析
    那麼為什麼我們還需要研究短時傅立葉變換呢(STFT)?原因是因為傅立葉分析有一個非常嚴重的缺點, 在將信號從時間域變換到頻率域去的時候,把時間信息丟失了。 當我們在用傅立葉變化去分析一個具體信號的時候, 我們不知道哪個頻率是對應在哪個時間點出現的,在哪個時間點消失的。
  • 傅立葉變換的本質及其公式解析
    對一個信號做傅立葉變換,然後直接做逆變換,這樣做是沒有意義的,在傅立葉變換和傅立葉逆變換之間有一個濾波的過程。將不要的頻率分量給濾除掉,然後再做逆變換,就得到了想要的信號。比如信號中摻雜著噪聲信號,可以通過濾波器將噪聲信號的頻率給去除,再做傅立葉逆變換,就得到了沒有噪聲的信號。
  • 傅立葉變換算法(一)
    ,讓各位對其有個總體大概的印象,也順便看看傅立葉變換所涉及到的公式,究竟有多複雜:以下就是傅立葉變換的4種變體連續傅立葉變換   一般情況下,若「傅立葉變換」一詞不加任何限定語,則指的是「連續傅立葉變換」。
  • 傅立葉變換和拉普拉斯變換的辨識!
    ,傅立葉變換的典型用途是將信號分解成幅值分量和頻率分量)。傅立葉變換能將滿足一定條件的某個函數表示成三角函數(正弦和/或餘弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。傅立葉變換是一種解決問題的方法,一種工具,一種看待問題的角度。
  • 傅立葉變換,拉普拉斯變換和Z變換的意義
    傅立葉變換能將滿足一定條件的某個函數表示成三角函數(正弦和/或餘弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。  傅立葉變換是一種解決問題的方法,一種工具,一種看待問題的角度。
  • C語言實現FFT(快速傅立葉變換)
    C函數函數簡介:此函數是通用的快速傅立葉變換C語言函數,移植性強,以下部分不依 賴硬體。此函數採用聯合體的形式表示一個複數,輸入為自然順序的復 數(輸入實數是可令複數虛部為0),輸出為經過FFT變換的自然順序的 複數使用說明:使用此函數只需更改宏定義FFT_N的值即可實現點數的改變,FFT_N的 應該為2的N次方,不滿足此條件時應在後面補0函數調用:FFT(s);時 間:2010-2-20
  • 傅立葉為何變換?
    傅立葉變換是很多理工科同學本科階段會接觸的基本概念,但也是比較令人困惑的概念之一。
  • 傅立葉變換
    奇妙的是,現代數學發現傅立葉變換具有非常好的性質,使得它如此的好用和有用,讓人不得不感嘆造物的神奇:傅立葉變換是線性算子,若賦予適當的範數,它還是酉算子;傅立葉變換的逆變換容易求出,而且形式與正變換非常類似;正弦基函數是微分運算的本徵函數,從而使得線性微分方程的求解可以轉化為常係數的代數方程的求解.在線性時不變的物理系統內,頻率是個不變的性質,從而系統對於複雜激勵的響應可以通過組合其對不同頻率正弦信號的響應來獲取
  • 深入淺出的學習傅立葉變換
    學習傅立葉變換需要面對大量的數學公式,數學功底較差的同學聽到傅立葉變換就頭疼。事實上,許多數學功底好的數位訊號處理專業的同學也不一定理解傅立葉變換的真實含義,不能做到學以致用!本文引用地址:http://www.eepw.com.cn/article/272577.htm  事實上,傅立葉變換的相關運算已經非常成熟,有現成函數可以調用。對於絕大部分只需用好傅立葉變換的同學,重要的不是去記那些枯燥的公式,而是解傅立葉變換的含義及意義。
  • 傅立葉變換與拉普拉斯變換的物理解釋及區別
    傅立葉變換能將滿足一定條件的某個函數表示成三角函數(正弦和/或餘弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。 傅立葉變換是一種解決問題的方法,一種工具,一種看待問題的角度。
  • 淺談傅立葉變換:關於傅立葉變換的幾種幾何學解釋
    (因為老師PPT用的少,當時很難直觀感受到這倆的區別)       直至信號與系統考試前幾天,偶然看到關於傅立葉變換的幾種幾何學解釋,才了解這背後的巧妙之處(說來慚愧,考試的時候腦子抽了,居然是傅立葉變換性質求錯了,還是對的改錯的, 最後只考了97分。。。)。傅立葉變換的偉大之處在於,它不僅解決了許多實際工程應用中的問題,也給我們認識世界提供了一個全新的視角。
  • 泰勒展開,傅立葉變換,拉普拉斯變換和Z變換的意義
    傅立葉變換傅立葉變換在物理學、數論、組合數學、信號處理、概率論、統計學、密碼學、聲學、光學、海洋學、結構動力學等領域都有著廣泛的應用(例如在信號處理中,傅立葉變換的典型用途是將信號分解成幅值分量和頻率分量)。傅立葉變換的物理意義是:將通常在時域表示的信號,分解為多個正弦信號的疊加。
  • Matlab中短時傅立葉變換 spectrogram和stft的用法
    在Matlab中,做短時傅立葉變換需要使用函數spectrogram,而在Matlab2019中,引入了一個新的函數stft,下面我們就來看下這兩個函數都如何使用。  短時傅立葉變換的基本原理就是將數據分段加窗,做fft,在分段時會有overlap,因此一個向量的短時傅立葉變換結果是一個矩陣。了解了這點,下面的函數及參數就更加容易理解了。
  • 傅立葉變換繪製二維圖形|小記
    > 原創: 鄭越升 壞印表機一般傅立葉變換的舉例圖都是無數枯燥的三角函數疊加成某個無規則的函數,但是最近看了一篇關於傅立葉變換的文章,裡面有張動圖如下圖,很有意思,通過很多相互疊加的圓周運動,可以畫出一個矢量的二維軌跡