用FFT和IFFT實現卷積

2020-12-04 墨塵

首先我們來理解什麼是卷積,卷積分為連續卷積和離散卷積,連續卷積是積分,離散卷積是求和。

首先我們來看一個列子:

比如說你的老闆命令你幹活,你卻到樓下打撞球去了,後來被老闆發現,他非常氣憤,扇了你一巴掌(注意,這就是輸入信號),於是你的臉上會漸漸地(賤賤地)鼓起來一個包,你的臉就是一個系統,而鼓起來的包就是你的臉對巴掌的響應,好,這樣就和信號系統建立起來意義對應的聯繫。下面還需要一些假設來保證論證的嚴謹:假定你的臉是線性時不變系統,也就是說,無論什麼時候老闆打你一巴掌,打在你臉的同一位置,你的臉上總是鼓起來一個相同高度的包來,並且假定以鼓起來的包的大小作為系統輸出。好了,前言說完了,下面可以進入核心內容——卷積

如果你每天都到地下去打撞球,那麼老闆每天都要扇你一巴掌,不過當老闆打你一巴掌後,你5分鐘就消腫了,所以時間長了,你甚至就適應這種生活了……如果有一天,老闆忍無可忍,以0.5秒的間隔開始不間斷的扇你的過程,這樣問題就來了,第一次扇你鼓起來的包還沒消腫,第二個巴掌就來了,你臉上的包就可能鼓起來兩倍高,老闆不斷扇你,脈衝不斷作用在你臉上,效果不斷疊加了,這樣這些效果就可以求和了,結果就是你臉上的包的高度隨時間變化的一個函數了,這就是離散卷積,把每次的結果求和輸出。

如果老闆再狠一點,扇你頻率足夠(無限)高,以至於你都辨別不清時間間隔了,那麼,求和就變成積分了,於是就變成了連續卷積。

可以這樣理解,在這個過程中的某一固定時刻,你臉上的包的鼓起程度和什麼有關呢?和之前每次打你都有關,也就是和之前的每次輸入都有關,但是每次的貢獻是不一樣的,越早打的巴掌,貢獻越小,所以這就是說,某一時刻的輸出是之前很多次輸入乘以各自的衰減係數之後的疊加而形成某一點的輸出,然後再把不同時刻的輸出點放在一起,形成一個函數,這就是卷積,卷積之後的函數就是你臉上的包的大小隨時間變化的函數。

那麼卷積為什麼可以通過FFT和IFFT實現呢?

首選對於FFT我們知道有這樣的性質,就是時序卷積等於頻域乘積,所以可以對輸入的兩個信號先分別求其FFT,將其轉化到頻域,在頻域對兩個信號相乘,然後再對其進行IFFT,將其轉回到時域,則就得到了兩個信號的時域卷積了。

為什麼需要通過FFT和IFFT實現呢?

因為直接求兩個信號的時域卷積計算量大,乘法加法次數多,對於有些算法複雜度高又要求實時性的場合,需要減少計算量,那麼就可以利用FFT和IFFT來實現卷積,因為無論是FFT和IFFT都有快速算法,能大量減少運算量。

FFT蝶形運算

相關焦點

  • PyTorch中的傅立葉卷積:通過FFT計算大核卷積的數學原理和代碼
    在機器學習應用程式中,使用較小的內核大小更為常見,因此PyTorch和Tensorflow之類的深度學習庫僅提供直接卷積的實現。 但是,在現實世界中,有很多使用大內核的用例,其中傅立葉卷積更為有效。PyTorch實現現在,我將演示如何在PyTorch中實現傅立葉卷積函數。
  • 用FPGA實現FFT算法(圖)
    當n較大時,因計算量太大,直接用dft算法進行譜分析和信號的實時處理是不切實際的。快速傅立葉變換(fast fourier transformation,簡稱fft)使dft運算效率提高1~2個數量級。其原因是當n較大時,對dft進行了基4和基2分解運算。fft算法除了必需的數據存儲器ram和旋轉因子rom外,仍需較複雜的運算和控制電路單元,即使現在,實現長點數的fft仍然是很困難。
  • 數字與信號處理實驗3 用FFT進行譜分析
    實驗三 用FFT進行譜分析                 一、實驗要求 進一步加深DFT 算法原理和基本性質的理解
  • 信號處理之功率譜原理與python實現
    知乎用戶CrisYang對功率譜、能量譜、幅值譜之間的關係進行了詳細的說明:在頻譜分析中幅度和功率是由緊密聯繫的兩個不同的物理量:能量能表述為幅值的平方和,也能表述為功率在時間上的積分;功率譜密度,是指用密度的概念表示信號功率在各頻率點的分布情況,是對隨機變量均方值的量度,是單位頻率的平均功率量綱;也就是說,對功率譜在頻域上積分就可以得到信號的平均功率,而不是能量。
  • 自相關和互相關函數計算方法總結及心得體會
    事實上,在圖象處理中,自相關和互相關函數的定義如下:設原函數是f(t),則自相關函數定義為R(u)=f(t)*f(-t),其中*表示卷積;設兩個函數分別是f(t)和g(t),則互相關函數定義為R(u)=f(t)*g(-t),它反映的是兩個函數在不同的相對位置上互相匹配的程度。
  • MATLAB實驗——FFT變換
    實驗基本原理與設計1 應用傅立葉變換進行圖像處理傅立葉變換是線性系統分析的一個有力工具,它能夠定量地分析諸如數位化系統、採樣點、電子放大器、卷積濾波器、噪音和顯示點等的作用。通過實驗培養這項技能,將有助於解決大多數圖像處理問題。對任何想在工作中有效應用數字圖像處理技術的人來說,把時間用在學習和掌握博裡葉變換上是很有必要的。
  • matlab下實現FFT信號分析
    利用matlab做頻譜分析前我們需要了解分析過程中的一些基礎知識,matlab中的 fft 函數用法、fftshift 函數的用法函數 1  fft :作用:快速傅立葉變換。語法:Y = fft(X)Y = fft(X,n)Y = fft(X,n,dim)語法:Y = fft(X) 用快速傅立葉變換 (FFT) 算法計算 X 的離散傅立葉變換 (DFT)。
  • 使用 matlab 進行傅立葉分析和濾波
    y=fft(x,N)。x,y定義如上,N是正整數,表示進行N點快速傅立葉變換。如果x長度小於N,則對x補零,使之與N相等;反則,則對x進行截取。對應的逆變換有兩種,分別為x=ifft(y)和x=ifft(y.N)。一般而言,N點fft的結果y,在處對應的頻率為最高採樣率的一半,y的後一半與前一半對稱。
  • 通俗易懂的講解FFT的讓你快速了解FFT
    在基本上的研究FFT,並且通過編程的形式實現之後。我決定寫一篇通俗易懂的關於FFT的講解。因此我在接下來的敘述中儘量非常通俗細緻的講解。 本人最早知道傅立葉變換的時候是沉迷於音樂的頻譜跳動無法自拔,當時就很想做一個音樂頻譜顯示器。搜閱了很多資料之後,才了解到傅立葉變換,和FFT。
  • 用C語言實現FFT算法
    /*****************fft programe*********************/#include typedef.h #include math.h本文引用地址:http://www.eepw.com.cn/article/150637.htmstruct compx
  • Matlab傅立葉變換、餘弦變換和小波變換
    離散傅立葉變換的 Matlab實現Matlab 函數 fft、fft2 和 fftn 分別可以實現一維、二維和 N 維 DFT 算法;而函數 ifft、ifft2 和 ifftn 則用來計算反 DFT 。
  • 每日函數——fft
    fft快速傅立葉變換語法Y  = fft(X)Y  = fft(X
  • 基於FPGA的高速卷積硬體設計及實現
    如果直接在時域進行卷積,卷積過程中所必須的大量乘法和加法運算,一定程度地限制了數據處理的實時性,不能滿足時效性強的工程應用。本文從實際工程應用出發,使用快速傅立葉變換(FFT)技術,探討卷積的高速硬體實現方法。
  • 快速傅立葉變換FFT在MATLAB中的實現
    正弦信號的頻率保持性:輸入為正弦信號,輸出仍是正弦信號,幅度和相位可能發生變化,但頻率與原信號保持一致,只有正弦信號才擁有這樣的性質。因此,周期序列實際上只有N個樣值有信息,通過推導可得到DFT、時域和頻域 (DFT) 上的有限長序列,可以用來「代表」周期序列,DFT在時域和頻域上均離散,且為有限長序列,可以用計算機進行處理。
  • 互相關(cross-correlation)中的一些概念及其實現
    正如卷積有線性卷積(linear convolution)和循環卷積(circular convolution)之分;互相關也有線性互相關(linear cross-correlation)和循環互相關(circular cross-correlation)。線性互相關和循環互相關的基本公式是一致的,不同之處在於如何處理邊界數據。其本質的不同在於它們對原始數據的看法不同。
  • 手把手解釋實現頻譜圖卷積
    在這篇文章中,我主要描述了Bruna等人在2014年,ICLR 2014的工作中,他們將頻譜分析和卷積神經網絡(ConvNets)相結合,產生了頻譜圖卷積網絡,可以有監督的方式進行訓練,用於圖的分類任務中。儘管與空間圖卷積方法相比,頻譜圖卷積目前還不太常用,但了解頻譜圖卷積的工作原理仍有助於避免產生和其他方法同樣的問題。