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: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
随机推荐
- Filestream 使用简单步骤
为了减少大文件在数据库的存储对数据库的读写效率造成的压力,多了FileStream这一个功能,下面介绍一下如何快速使用FileStream. 1.开启SqlServer实例对FileStream 的开 ...
- MySQL基础学习(二) 常用SQL命令
一. 1. select version(); 查看数据库版本 2. select user(); 查看当前用户 3. select now(); 查看当前时间 4. show databases; ...
- MongoDB Sharding、库、collection设计学习汇总
sharding设计须考虑的几个因素 Sharding Key的选择 在片键的选择上,最好是能够在字段中选择混合型的片键,大范围的递增健.和随机分布的健组合,如按月份递增.按用户名 ...
- 讲讲js中的逻辑与(&&)以及逻辑或(||)
前几天看到一个函数,百思不得其解,今天早上醒来看了本js的书,正好讲到操作符的用法,给大家分享下js中的&&,||,和我们用的其他的编程语言还是有点区别的. 直接上那个函数的代码: f ...
- my_strcpy()
char* my_strcpy(char* des, const char* src){ while(*des++=*src++); return des; }
- android 查看解压后的.xml文件代码(axmlprinter2)
axmlprinter2工具下载地址:http://pan.baidu.com/s/1o67eXtS 方法:1.将要查看的.xml文件复制到AXMLPrinter2.jar所在目录2.通过cmd 输入 ...
- Android 中PopupWindow使用 (转)
参考学习后遇到问题: 要引用:有好几个,可以用错误提示解决: import android.widget.PopupWindow; import android.widget.Toast; Activ ...
- Linux vim编辑命令
yum install -y vim-enhanced 安装vim 命令 一般模式 shift 4 行尾 shift 6 或 0行首 gg 顶部 G 下部 复制 yy 剪切几行 数字 dd p粘贴 ...
- dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法
dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法 grub 启动菜单后加入 rootdelay=90, 如下:/boot/vmlinuz-2.6.3 ...
- Web报表页面如何传递中文参数
1.场景描述 在用报表开发工具FineReport设计的web报表中,给iframe设置src嵌入某个报表时,往往会给报表传递初始的参数值,例如: <iframe id="report ...