1. 程式人生 > >Apache Commons Math3學習筆記(1)- 快速傅立葉變換

Apache Commons Math3學習筆記(1)- 快速傅立葉變換

傅立葉變換:org.apache.commons.math3.transform.FastFourierTransformer類。

用法示例程式碼:

double  inputData = new double[arrayLength];

// ... 給inputData賦值

FastFourierTransformer fft = new FastFourierTransformer(DftNormalization.STANDARD);
Complex[] result = fft.transform(inputData, TransformType.FORWARD);

使用還是非常簡單的。首先要建立待計算資料的陣列,可以是double型別,亦可是org.apache.commons.math3.complex.Complex型別,然後建立org.apache.commons.math3.transform.FastFourierTransformer物件例項,最後呼叫其transform方法即可得到存放於複數陣列中的傅立葉變換結果。

完整的示例程式碼如下:

import org.apache.commons.math3.transform.DftNormalization;
import org.apache.commons.math3.transform.FastFourierTransformer;
import org.apache.commons.math3.transform.TransformType;

interface TestCase
{
   public Object run(List<Object> params) throws Exception;
   public List<Object> getParams();
}

class CalcFFT implements TestCase
{
   public CalcFFT()
   {
      System.out.print("本算例用於計算快速傅立葉變換。正在初始化 計算資料(" + arrayLength + "點)... ...");
      inputData = new double[arrayLength];
      for (int index = 0; index < inputData.length; index++)
      {
         inputData[index] = (Math.random() - 0.5) * 100.0;
      }
      System.out.println("初始化完成");
   }

   @Override
   public List<Object> getParams()
   {
      return null;
   }

   @Override
   public Object run(List<Object> params) throws Exception
   {
      FastFourierTransformer fft = new FastFourierTransformer(DftNormalization.STANDARD);
      Complex[] result = fft.transform(inputData, TransformType.FORWARD);
      return result;
   }

   private double[] inputData = null;
   private final int arrayLength = 4 * 1024*1024;

}

public class TimeCostCalculator
{
   public TimeCostCalculator()
   {
   }

   /**
    * 計算指定物件的執行時間開銷。
    * 
    * @param testCase 指定被測物件。
    * @return 返回sub.run的時間開銷,單位為s。
    * @throws Exception
    */
   public double calcTimeCost(TestCase testCase) throws Exception
   {
      List<Object> params = testCase.getParams();
      long startTime = System.nanoTime();
      testCase.run(params);
      long stopTime = System.nanoTime();
      System.out.println("start: " + startTime + " / stop: " + stopTime);
      double timeCost = (stopTime - startTime) * 1.0e-9;
      //      double timeCost = BigDecimal.valueOf(stopTime - startTime, 9).doubleValue();
      return timeCost;
   }

   public static void main(String[] args) throws Exception
   {
      TimeCostCalculator tcc = new TimeCostCalculator();
      double timeCost;

      System.out.println("--------------------------------------------------------------------------");
      timeCost = tcc.calcTimeCost(new CalcFFT());
      System.out.println("time cost is: " + timeCost + "s");
      System.out.println("--------------------------------------------------------------------------");
   }

}
在i5四核處理器+16GB記憶體的桌上型電腦上,計算4百萬點FFT,耗時0.7s。還是挺快的。

相關推薦

Apache Commons Math3學習筆記1- 快速變換

傅立葉變換:org.apache.commons.math3.transform.FastFourierTransformer類。 用法示例程式碼: double inputData = new double[arrayLength]; // ... 給inputDa

OpenCV學習筆記離散變換

離散傅立葉變換: 傅立葉變換將講時域訊號分解為不同頻率的正弦訊號或餘弦訊號疊加之和,時域分析只能反映訊號的幅值隨時間變化得情況,除單頻率分量的簡諧波外,很難對資訊頻率的組成及各頻率分量的大小進行詳細分析,而訊號頻譜分析提供了比時域訊號波形更直觀、更豐富的資訊。在實際的影象處

Apache Commons Math3學習筆記2

多項式曲線擬合:org.apache.commons.math3.fitting.PolynomialCurveFitter類。 用法示例程式碼: // ... 建立並初始化輸入資料: double[] x = new double[...]; double[] y =

myBatis學習筆記1——快速入門

在專案中使用myBatis 匯入jar包 在src下建立配置檔案 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis

【GCN】圖卷積網路初探——基於圖Graph變換和卷積

本文為從CNN到GCN的聯絡與區別——GCN從入門到精(fang)通(qi)的閱讀筆記,文中絕大部分公式和圖片摘自原文。 文章目錄 一、CNN(卷積神經網路)中的離散卷積 二、GCN基本概念介紹 (一)圖Grap

連續變換與離散變換級數Fourier Series

訊號的正交分解到傅立葉級數(FS)一、訊號分解為正交函式二、傅立葉級數的三角形式由(一)可知,可將一個週期為T的訊號f(T),在(t0,t0+T)內表示為三角函式集的線性組合,即:上式即為週期訊號f(t),在區間(t0,t0+T)內的三角傅立葉級數展開式。Ω=2π/T稱為基波

matlab在DSP中的應用---離散變換DFT

一、實驗目的 (1)加深對離散傅立葉變換(DFT)基本概念的理解 (2)瞭解有限長序列傅立葉變換(DFT)與離散時間傅立葉變換(DTFT)的聯絡 (3)掌握用MATLAB語言進行離散傅立葉變換和逆變換的方法 二、實驗原理 1.有限長序列的傅立葉變換(D

JAVA學習筆記1——a++與++a的區別

col int 演示 opera 解析 代碼 數據 ++i div 需求:此博客用於解釋i++與++i的區別。 過程: 1、名稱解釋 ++:自增,即在原有數據基礎上+1,再賦給原有數據。 2、程序演示 (1)代碼: 1 class OperateDemo 2 { 3

vray學習筆記1

com .cn 過程 分組 是把 皮膚 mon image 基本 vray是個什麽東西? 它是個渲染器。 渲染器是個什麽東西? 渲染器就是3d軟件裏面把模型畫成一張圖片的東西,渲染的過程就是把3D物體變成2D畫面的過程。 模型是個什麽東西? 模型就是模型,它由兩部分組成,第

《深入理解C指針》學習筆記1--- 指針之外

結構 def form 學習 編程 stdlib.h struct 一個 char   C語言從誕生之初就非常善於和硬件打交道,經過這麽多年的發展之後,其靈活性和超強的特征是受到幾乎所有程序員的肯定。C語言的這種靈活性很大一部分程度來源與C指針,指針為C語言動態操控內存提供

CS231n 學習筆記1 Image CLassification

eight function 分享 便是 數據驅動 rain 分類問題 很難 特征 圖像分類是計算機視覺中的一項核心任務,那麽什麽是圖像分類? 例如,給你一個標簽集,其中包括(貓、狗、鳥、卡車、飛機...等) 然後給你一張圖片,那麽這張圖片屬於哪個類別呢?這就是一個分類

bootstrap 學習筆記1---介紹bootstrap和柵格系統

優先 cal 圖片 應用 尺寸 文件中 lin png ice   學習前端許久,對於布置框架和響應瀏覽器用html 和javascript 寫的有點繁瑣,無意間看到這個框架,覺得挺好用的就開始學習了,但是這個框架上面有很多知識,不是所有的都要學的,故將學習筆記和覺得重點的

《挑戰程序設計競賽》學習筆記 1

設計 allow 而且 硬幣 ack ket 程序設計 all 不能 2.2 貪心法 貪心法是遵循某種規則,不斷貪心選取當前最優策略的算法設計方法。 貪心法的求解思想是通過叠代地選取當前問題的局部最優解法來達成總體最優解,在叠代的過程中不斷地產生局部最優解和下一個與之前

AngularJs學習筆記1——ng-app

oot you ctrl span fun 代碼 問題 筆記 doctype 眾所周知: ng-app 指令用於告訴 AngularJS 應用當前這個元素是根元素。 所有 AngularJS 應用都必須要要一個根元素。 HTML 文檔中只允許有一個 ng-app 指令,如果

Nordic nRF52832 學習筆記1 介紹,入門,與準備工作

例程 盜版 path pdf 規範 準備 但是 依然 可能   近來,物聯網已成為大勢所趨,VR與AR正方興未艾,各種手環、遙控、智能家居也在粉墨登場。技術前沿的領航者們已經快馬加鞭,各種意誌與暗示也在上傳下達。物聯網,無線通訊,移動互聯,將成為新的目標與寵兒。最近開的電賽

javascript 高級程序設計學習筆記1

元素 新的 logs html light begin 知識 gin nbsp 知識補充: var box = document.querySelector(‘#box‘); //"beforebegin" ,在當前元素之前插入一個緊鄰的同輩元素; box.ins

Postgresql 學習筆記1

sql postgre 一、環境#配置遠程連接 su postgres vim /var/lib/pgsql/9.4/data/postgresql.conf 編輯配置文件 listen_address=’localhost’ 前面的註釋#去掉,並把’localhost’該為’*’;

Hibernate學習筆記1---hibernate快速上手與準備工作

成了 -- 開源 工作 快速 tar ref orm 磁盤 持久層介紹 持久化:將內存中的數據保存在磁盤等存儲設備中。 持久化對象:指已經存儲在數據庫護著磁盤的業務對象 經典的軟件應用體系結構(三層結構) 在三層結構中,由於業務邏輯除了負責業務邏輯以外,還要負責相關的數據

jQuery源碼學習筆記1

ase tolower nodetype apt jquer 元素 bre 技術分享 停止 在慕課網上學習jQuery源碼,做一些筆記小研究。 第1章 節點遍歷 第2章 文檔處理 第3章 元素操作 第4章 樣式操作 第5章 事件體系 第6章 數據交互 第7章

Struts2學習筆記1---相關配置

XML def rec 模塊 定向 -1 開發 oba 合並 Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合並的全新的Struts 2框架。 1創建action對象(三種) 1 創建普通的類,不繼承任何類,也不