FFT(快速傅立叶算法 for java)
package com.test.test2;
public class FFT {
public static final int FFT_N_LOG = 10; // FFT_N_LOG <= 13
public static final int FFT_N = 1 << FFT_N_LOG;
private static final float MINY = (float) ((FFT_N << 2) * Math.sqrt(2)); // (*)
private final float[] real, imag, sintable, costable;
private final int[] bitReverse;
public FFT() {
real = new float[FFT_N];
imag = new float[FFT_N];
sintable = new float[FFT_N >> 1];
costable = new float[FFT_N >> 1];
bitReverse = new int[FFT_N];
int i, j, k, reve;
for (i = 0; i < FFT_N; i++) {
k = i;
for (j = 0, reve = 0; j != FFT_N_LOG; j++) {
reve <<= 1;
reve |= (k & 1);
k >>>= 1;
}
bitReverse[i] = reve;
}
double theta, dt = 2 * 3.14159265358979323846 / FFT_N;
for (i = 0; i < (FFT_N >> 1); i++) {
theta = i * dt;
costable[i] = (float) Math.cos(theta);
sintable[i] = (float) Math.sin(theta);
}
}
/**
* 用于频谱显示的快速傅里叶变换
*
* @param realIO
* 输入FFT_N个实数,也用它暂存fft后的FFT_N/2个输出值(复数模的平方)。
*/
public void calculate(float[] realIO) {
int i, j, k, ir, exchanges = 1, idx = FFT_N_LOG - 1;
float cosv, sinv, tmpr, tmpi;
for (i = 0; i != FFT_N; i++) {
real[i] = realIO[bitReverse[i]];
imag[i] = 0;
}
for (i = FFT_N_LOG; i != 0; i--) {
for (j = 0; j != exchanges; j++) {
cosv = costable[j << idx];
sinv = sintable[j << idx];
for (k = j; k < FFT_N; k += exchanges << 1) {
ir = k + exchanges;
tmpr = cosv * real[ir] - sinv * imag[ir];
tmpi = cosv * imag[ir] + sinv * real[ir];
real[ir] = real[k] - tmpr;
imag[ir] = imag[k] - tmpi;
real[k] += tmpr;
imag[k] += tmpi;
}
}
exchanges <<= 1;
idx--;
}
j = FFT_N >> 1;
/*
* 输出模的平方(的FFT_N倍):
* for(i = 1; i <= j; i++)
* realIO[i-1] = real[i] * real[i] + imag[i] * imag[i];
*
* 如果FFT只用于频谱显示,可以"淘汰"幅值较小的而减少浮点乘法运算. MINY的值
* 和Spectrum.Y0,Spectrum.logY0对应.
*/
sinv = MINY;
cosv = -MINY;
for (i = j; i != 0; i--) {
tmpr = real[i];
tmpi = imag[i];
if (tmpr > cosv && tmpr < sinv && tmpi > cosv && tmpi < sinv)
realIO[i - 1] = 0;
else
realIO[i - 1] = tmpr * tmpr + tmpi * tmpi;
}
}
public static void main(String[] args) {
FFT fft2 = new FFT();
float[] realIo = { 1, 2 };
fft2.calculate(realIo);
}
}
FFT(快速傅立叶算法 for java)的更多相关文章
- BZOJ 2179: FFT快速傅立叶
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2923 Solved: 1498[Submit][Status][Di ...
- 【bzoj2179】FFT快速傅立叶 FFT模板
2016-06-01 09:34:54 很久很久很久以前写的了... 今天又比较了一下效率,貌似手写复数要快很多. 贴一下模板: #include<iostream> #include& ...
- 【BZOJ 2179】 2179: FFT快速傅立叶 (FFT)
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3308 Solved: 1720 Description 给出两个n位 ...
- bzoj 2179: FFT快速傅立叶 -- FFT
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MB Description 给出两个n位10进制整数x和y,你需要计算x*y. Input ...
- 【BZOJ2179】FFT快速傅立叶
[BZOJ2179]FFT快速傅立叶 Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位 ...
- [bzoj2179]FFT快速傅立叶_FFT
FFT快速傅立叶 bzoj-2179 题目大意:给出两个n位10进制整数x和y,你需要计算x*y. 注释:$1\le n\le 6\times 10^4$. 想法: $FFT$入门题. $FFT$实现 ...
- 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶
第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度 ...
- BZOJ 2179 FFT快速傅立叶 题解
bzoj 2179 Description 给出两个n位10进制整数x和y,你需要计算x*y. [题目分析] 高精裸题.练手. [代码] 1.手动高精 #include<cstdio> # ...
- FFT快速傅里叶变换算法
1.FFT算法概要: FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法.即为快速傅氏变换.它是根据离散傅氏变换的奇.偶.虚.实等特性,对离散傅立叶变换 ...
随机推荐
- Xcode - 必不可少的插件
1. backLight 2. BBUDebuggerTuckAway 3. Cocoapod 4. FuzzyAutoComplete 5. HOStringSense 6. KissImageN ...
- 17款code review工具
本文是码农网原创翻译,转载请看清文末的转载要求,谢谢合作! 好的代码审查器可以大大地帮助程序员提高代码质量,减少错误几率. 虽然现在市场上有许多可用的代码审查工具,但如何挑选也是一个艰巨的任务.在咨询 ...
- oracle 内置函数 least decode
在博客园的第一个博客,为什么叫第一个.... oracle 内置函数 east(1,2,3,4.....) 可以有多个值,最多几个?不知道欢迎补充 ,,,) from dual 这个函数返回是1,就是 ...
- Tesseract——OCR图像识别 入门篇
Tesseract——OCR图像识别 入门篇 最近给了我一个任务,让我研究图像识别,从我们项目的screenshot中识别文字信息,so我开始了学习,与大家分享下. 我看到目前OCR技术有很多,最主要 ...
- java.util.List
/* * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
- Sql狗血的Bit类型赋值与取值
Bit 数据类型在 SQL Server 数据库中以存储 1.0 进行存储. 往数据库中添加,修改 bit 类型的字段时,只能用 0 或者 1. 关于修改 Bit 类型的字段 1.若使用 SQL 语句 ...
- RxJava开发精要8 – 与REST无缝结合-RxJava和Retrofit
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...
- !!对python列表学习整理列表及数组详细介绍
1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...
- poj2761Feed the dogs(划分树-区间K值)
链接 这树着实不好理解啊 讲解http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html 对于找K值 右区间的确定不是太理解..先当 ...
- layer父页面刷新
$.ajax({ type:"POST", url:"{sh::U('Address/edit')}", data: $("#saveform&quo ...