FastFourierTransform (FFT)
代码来自互联网开源,仅作为收集整理使用。
FastFourierTransform.h
#pragma once
#include <stdio.h>
#include <math.h> #ifndef INCLUDE_FASTTOURIERTRANSFORM
#define INCLUDE_FASTTOURIERTRANSFORM /************************************************************************/
/* CFastFourierTransform */
/************************************************************************/
#define PI_2 6.283185F
#define PI 3.1415925F
class CFastFourierTransform
{
private:
float* xre;
float* xim;
float* mag;
float* fftSin;
float* fftCos;
int* fftBr;
int ss;
int ss2;
int nu;
int nu1; int BitRev(int j, int nu);
void PrepareFFTTables();
public:
CFastFourierTransform(int pSampleSize);
~CFastFourierTransform(void); float* Calculate(float* pSample, size_t pSampleSize);
}; #endif
FastFourierTransform.cpp
#include "FastFourierTransform.h" /************************************************************************/
/* CFastFourierTransform */
/************************************************************************/
CFastFourierTransform::CFastFourierTransform(int pSampleSize)
{
xre = NULL;
xim = NULL;
mag = NULL;
fftSin = NULL;
fftCos = NULL;
fftBr = NULL; ss = pSampleSize;
ss2 = ss >> ;
nu = (int) (log((float)ss) / log((float)));
nu1 = nu - ; xre = new float[ss]; // real part
xim = new float[ss]; // image part
mag = new float[ss2]; PrepareFFTTables();
} CFastFourierTransform::~CFastFourierTransform(void)
{
if(xre != NULL)
delete [] xre; if(xim != NULL)
delete [] xim; if(mag != NULL)
delete [] mag; if(fftSin != NULL)
delete [] fftSin; if(fftCos != NULL)
delete [] fftCos; if(fftBr != NULL)
delete [] fftBr; xre = NULL;
xim = NULL;
mag = NULL;
fftSin = NULL;
fftCos = NULL;
fftBr = NULL;
} void CFastFourierTransform::PrepareFFTTables()
{
int n2 = ss2;
int nu1 = nu - ; fftSin = new float[nu * n2];
fftCos = new float[nu * n2]; int k = ;
int x = ;
for (int l = ; l <= nu; l++) {
while (k < ss) {
for (int i = ; i <= n2; i++) {
float p = (float)BitRev(k >> nu1, nu);
float arg = (PI_2 * p) / (float) ss;
fftSin[x] = (float) sin(arg);
fftCos[x] = (float) cos(arg);
k++;
x++;
} k += n2;
} k = ;
nu1--;
n2 >>= ;
} fftBr = new int[ss];
for (k = ; k < ss; k++)
fftBr[k] = BitRev(k, nu);
} int CFastFourierTransform::BitRev(int j, int nu) {
int j1 = j;
int k = ;
for (int i = ; i <= nu; i++) {
int j2 = j1 >> ;
k = ((k << ) + j1) - (j2 << );
j1 = j2;
} return k;
} float* CFastFourierTransform::Calculate(float* pSample, size_t pSampleSize) {
int n2 = ss2;
int nu1 = nu - ;
int wAps = pSampleSize / ss;
size_t a = ; for (size_t b = ; a < pSampleSize; b++) {
xre[b] = pSample[a];
xim[b] = 0.0F;
a += wAps;
} int x = ;
for (int l = ; l <= nu; l++) {
for (int k = ; k < ss; k += n2) {
for (int i = ; i <= n2; i++) {
float c = fftCos[x];
float s = fftSin[x];
int kn2 = k + n2;
float tr = xre[kn2] * c + xim[kn2] * s;
float ti = xim[kn2] * c - xre[kn2] * s;
xre[kn2] = xre[k] - tr;
xim[kn2] = xim[k] - ti;
xre[k] += tr;
xim[k] += ti;
k++;
x++;
}
} nu1--;
n2 >>= ;
} for (int k = ; k < ss; k++) {
int r = fftBr[k];
if (r > k) {
float tr = xre[k];
float ti = xim[k];
xre[k] = xre[r];
xim[k] = xim[r];
xre[r] = tr;
xim[r] = ti;
}
} mag[] = (float) sqrt(xre[] * xre[] + xim[] * xim[]) / (float) ss;
for (int i = ; i < ss2; i++)
mag[i] = (2.0F * (float) sqrt(xre[i] * xre[i] + xim[i] * xim[i])) / (float) ss; return mag;
}
FastFourierTransform (FFT)的更多相关文章
- [C#] NAudio 库的各种常用使用方式: 播放 录制 转码 音频可视化
概述 在 NAudio 中, 常用类型有 WaveIn, WaveOut, WaveStream, WaveFileWriter, WaveFileReader 以及接口: IWaveProvider ...
- 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】
原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 【转】用C语言实现FFT算法
傅里叶变换 快速傅里叶变换(Fast Fourier Transform,FFT)是一种可在 时间内完成的离散傅里叶变换(Discrete Fourier transform,DFT)算法. 在算法 ...
- 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)
对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...
- 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2978 Solved: 1523[Submit][Status][Di ...
- 为什么FFT时域补0后,经FFT变换就是频域进行内插?
应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...
- FFT NNT
算算劳资已经多久没学新算法了,又要重新开始学辣.直接扔板子,跑...话说FFT算法导论里讲的真不错,去看下就懂了. //FFT#include <cstdio> #include < ...
- CC countari & 分块+FFT
题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
随机推荐
- GitHub Desktop 桌面工具,离线版本下载(无需考虑网络问题)
http://pan.baidu.com/s/1qYq4X0C GitHub Desktop 桌面工具,离线版本下载 对于网络不好,不稳定,安装多次都不成功的,这是你们的最好的安装方法了.
- WPF学习之路(三) 属性与依赖
类型是DependencyProperty的属性是依赖属性 依赖属性不同于普通的.Net属性,类似于一个计算过程,根据依赖的值得到最终值. 为什么引入依赖属性: MSDN原文 One of the p ...
- MyEclipse Servers视窗出现“Could not create the view: An unexpected exception was thrown”错误的解决办法
打开myeclipse所在的wordspace文件夹,在下面子文件夹 .metadata\.plugins\org.eclipse.core.runtime\.settings删除 com.genui ...
- Spring Batch 批处理框架
<Spring Batch 批处理框架>基本信息作者: 刘相 出版社:电子工业出版社ISBN:9787121252419上架时间:2015-1-24出版日期:2015 年2月开本:16开页 ...
- [20140829]spinlock导致cpu居高不下
背景: 出现cpu高于常规的告警 排查: 1.开跟踪,没有发现cup特别高的查询 2.查看内核cpu使用量,看是否是sql server 端引起 3.查看负荷,是否负荷特别高这里使用 batch re ...
- 【转载】关于Alipay支付宝接口(Java版)
转载自:http://blog.163.com/lai_chao/blog/static/70340789201412724619514/ 1.alipay 双功能支付简介 2.alipay 提交支付 ...
- W3School-CSS 边框(border)实例
CSS 边框(border)实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边 ...
- Linux 多线程信号量同步
PV原子操作 P操作: 如果有可用的资源(信号量值>0),则此操作所在的进程占用一个资源(此时信号量值减1,进入临界区代码); 如果没有可用的资源(信号量值=0),则此操作所在的进程被阻塞直到系 ...
- proteus 运行出错,用户名不可使用中文!
仿真的时候提示如图提示 cannot open ’c\user\小名\AppData\local\temp\LISA0089.sdf’ 系统用户名不能是中文! 解决办法:重新建立个账户,记得用英文命名 ...
- 理解 OpenStack + Ceph (8): 基本的 Ceph 性能测试工具和方法
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...