日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

傅里叶变换基本概念及复数类实现

發布時間:2024/1/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 傅里叶变换基本概念及复数类实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ??最近對圖像處理算法比較感興趣,也看了一些數字圖像處理相關書籍,自己也實現過一些簡單的圖像處理算法。隨著了解的深入,發現要真正理解圖像處理各種騷操作,繞不開基于傅里葉變換的各種頻率域濾波。對于lz這種數學渣來說,看到各種數學公式推導,簡直令人頭大,通過傅里葉變換把直觀圖像轉換為抽象的頻譜圖更是讓人難以理解。

? ? ? ? 上面是一張傅里葉變換后的頻譜圖,如果不了解傅里葉變換,很難從上圖中分析出原圖包含的一些特征。研究了一段時間傅里葉變換,按照lz的理解,其實圖像的傅里葉變換就是根據空間位置對圖像灰度值進行拆分,分離出從高到低不同頻率,頻譜圖就是展示一張圖像從低頻(頻譜中心,圖像平均灰度)到高頻(遠離頻譜中心,對應灰度變化大的區域)的分布。而頻率域濾波則是根據圖像的頻率特征,采用不同濾波器,理想低通、高通,高斯低通、高通等,對頻率域的圖像數據進行處理,之后通過逆傅里葉變換還原出濾波后的圖像。

? ? ? ??岡薩雷斯的《數字圖像處理》第四章節用了將近70頁的篇幅對傅里葉變換進行了逐步講解,同時也表明了頻率域濾波在圖像濾波中的重要性。雖然是圖像處理的業余愛好者,lz還是決定有必要把傅里葉變換盡量搞清楚一些。因為沒有接觸過MATLAB和OpenCV(暫時也不打算使用第三方工具),所以文章所涉及到的代碼都使用lz比較熟悉的java來實現。

? ? ? ??為了更好的理解傅里葉變換,lz將傅里葉變換從一些基本概念到應用拆分為不同層次,基本概念及推導、一維離散傅里葉變換、快速傅里葉變換、二維傅里葉變換、頻率域濾波。這里就對傅里葉變換的一些基本概念做個總結。

? ? ? ??傅里葉變換涉及的一些基本概念:復數、歐拉公式、傅里葉公式、取樣和卷積。

? ? ? ? 一、復數

? ? ? ? 復數的形式:C = a + jb

? ? ? ??a為實部,jb為虛部,其中b為實數,,為虛數。復數也可以理解為一個二維平面上的點,實部為x軸,虛部為y軸。

? ? ? ? 復數的共軛復數:C’?= a - jb,實部相同,虛部符號相反。

? ? ? ? 復數滿足四則運算法則

? ? ? ? 例如:C’’?= c + jd;

? ? ? ? 復數相加:C + C’’?= (a + c) + j(b+d)

? ? ? ? 復數相減:C - C”?= (a - c) + j(b - d)

? ? ? ? 復數相乘:C * C”?= (a + jb) * (c + jd) = a*c - bd + j(ad + bc)

? ? ? ? 復數相除:C / C”?= (a + jb)/(c + jd) = (a + jb)*(c - jd)/(c + jd)(c - jd)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? =[(ac + bd) - j(bc - ad)] / (c2 + d2)

? ? ? ?復數的模長:C = a + jb模長為|C| =

? ? ?? 根據三角函數,復數可變換為:復數可變換為:C = |C|()形式,實際上在編程中傅里葉變換也是通過這種形式進行計算的。

? ? ? ? 二、歐拉公式

? ? ? ??

? ? ? ? 傅里葉變換公式也就是通過歐拉公式變換為方便計算的復數形式。

? ? ?? 三、傅里葉變換公式

? ? ? 傅里葉變換公式: ?

? ? ? 傅里葉反變換公式:

? ? ??以上兩個公式就是傅里葉變換和逆變換,但這是在連續函數上的變換,我們實際使用的是離散函數的傅里葉變換。

? ? ? 傅里葉變換公式的簡單推導過程:

? ? ? ??例:常數函數f(t)=A ,在有限區間內,傅里葉公式可做如下變換:

? ? ? ??

? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ??

? ? ? ? 根據歐拉公式

? ? ? ? ? ??

? ? ? ? 上面公式可以做進一步變換

? ? ? ??

? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ??

? ? ? ? ? ? 上式結果也可由三角恒等式直接變換過來:

? ? ? ? ? ? 三角恒等式:

? ? ? ? ? ? 通常,為了顯示,需要處理幅值,變換為傅里葉譜或頻譜:

? ? ? ? ? ??

? ? ? ? 四、取樣和卷積

? ? ? ? ? ? ?? 上面所講的傅里葉公式及推導都是在連續函數上進行的,而要實現計算機能夠處理的數據必須是離散的信號,所以這就 ? ? ? ? ? 涉及到取樣。連續的數字信號,例如音頻、電磁波信號等,需要對原始信號采樣后再進行處理,而圖像處理方面,可 ? ? ? ? ? ? ? ? ? 以把每一個像素上的灰度值看做已經采樣后的數據,我們只需要把圖像數據作為離散的信號輸入即可。

? ? ? ? ? ? ? ??至于卷積,做過圖像空間域濾波以后不難理解,圖像的傅里葉變換,是以整個圖像所有對圖像上每個像素進行傅里葉計 ? ? ? ? ? 算,也就是說以整個圖像作為一個周期,計算不同頻率在某個像素位置上的疊加。那么一幅像素數量為N的圖像,需要進 ? ? ? ? ? ? 行的離散傅里葉變換計算次數為N * N。例如,對一幅2000萬像素的圖片做傅里葉變換計算,需要計算2000萬 * 2000萬 ? ? ? ? ? ? ? ? 次,這對超級計算機來說也是一個不小的挑戰,于是有了快速傅里葉變換,把計算量降低為N * log2N,這才使傅里葉變換 ? ? ? ? ? 有了實用價值,至于快速傅里葉變換,后面再詳細講。

? ? ? ? 五、復數類的實現

? ? ? ? ? ? ?? 上面只是對傅里葉變換概念及公式做了個簡單的講解,其實從代碼上實現傅里葉變換并沒有那么復雜。由于傅里葉變換 ? ? ? ?? 是在復數基礎上進行計算的,接下來就邁出傅里葉變換的第一步,復數的代碼實現。

? ? ? ? ? 附上java代碼:

package FourierTransform;/*** 復數類* @author admin**/ public class Complex {private double a; //復數實部private double b; //復數虛部//創建一個復數類實例public Complex(double a,double b) {this.a = a;this.b = b;}//獲取復數實部public double getRealPart() {return this.a;}//獲取復數虛部public double getImaginePart() {return this.b;}//對復數重新賦值public void changeVaule(double a, double b) {this.a = a;this.b = b;}//共軛復數public Complex conjugate() {return new Complex(this.a,-this.b);}//計算復數模長public double absValue() {return Math.sqrt(this.a * this.a + this.b * this.b);}//復數加運算,實部與實部相加,虛部與虛部相加public Complex add(Complex C) {return new Complex(this.a + C.a, this.b + C.b);}//復數相減public Complex minus(Complex C) {return new Complex(this.a - C.a, this.b - C.b);}/*** 復數相乘* a*a1+a*jb1+jb*a1*-b*b1* @param C* @return*/public Complex multiply(Complex C) {double A = this.a * C.a - this.b * C.b;double B = this.a * C.b + this.b * C.a;return new Complex(A, B);}/*** 復數相除* (a + jb) / (c + jd) = [(a + jb) * (c - jd)] / [(c + jd) * (c - jd)]* =[(ac + bd) + j(bc - ad)] / [(c^2 + d^2)]* @param C* @return*/public Complex divide(Complex C) {if (C.a == 0 && C.b == 0) {System.out.println("被除數不能為空!");return null;}double A = (this.a * C.a + this.b * C.b) / (C.a * C.a + C.b * C.b);double B = (this.b * C.a - this.a * C.b) / (C.a * C.a + C.b * C.b);return new Complex(A,B);}//toString方法public String toString() {if (a == 0 && b == 0) {return "復數為空!";}else if (a == 0) {return this.b + "j";}else if (b == 0) {return a + "";}else if (b > 0) {return this.a + "+" + this.b + "j";}else{return this.a + "" + this.b + "j";}}//測試public static void main(String[] args) {Complex c1 = new Complex(1, 2);System.out.println(c1.toString());Complex c2 = c1.conjugate();System.out.println(c2.toString());System.out.println(c1.absValue());} }

?

?

?

?

總結

以上是生活随笔為你收集整理的傅里叶变换基本概念及复数类实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。