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: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
随机推荐
- windows server 远程连接设置
1设置远程连接数修改 服务器安装了Windows Server 2008,现在要增加远程连接,开启服务器上的远程桌面连接,使用管理员账户远程登录.默认情况下Windows Server 2008允许一 ...
- Linux下python安装升级详细步骤 | Python2 升级 Python3
Linux下python升级步骤 Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...
- Android简化xml sax解析
dom解析占用内存大(我这边需要解析各种各样的kml文件,有时4-5M的kml文件使用dom解析很多手机就内存溢出了),也需要引入第三方库,所以使用相对于节省内存很多.不需引入其他库的sax解析就是很 ...
- CMPP3.0实现物联网卡通讯
当下物联网发展迅猛,物联网卡可以接受短信指令,实现千里之外尽可掌控.本人做过一个这类项目,把相关经验记录下来,分享给需要的人. 物联网卡通讯其实跟电话卡一样,可以使用CMPP协议.不过由于物联网卡位数 ...
- mysql多实例的配置和管理
原文地址:mysql多实例的配置和管理 作者:飞鸿无痕 多实例mysql的安装和管理 mysql的多实例有两种方式可以实现,两种方式各有利弊.第一种是使用多个配置文件启动不同的进程来实现多实例,这种方 ...
- ELF Format 笔记(二)—— ELF Header
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 以 32 位的 ELF header 数据结构为例: #define EI_NIDENT 16 typede ...
- Terminal中输入命令直接打开QtCreator,以及创建其桌面快捷方式
工业项目设计学习第一步,熟悉开发工具 Qt学习论坛,东西多,但也杂 emouse的博客,以前学习STM32开发环境搭建时也是参考这位博主的 更多详细的步骤在上面都能找到,今天先不写,等明天把硬件设备全 ...
- 使用jlink直接烧norflash或者nandflash不借助uboot的猜想
由于喜欢折腾,我是在linux下使用jlink的,既然JLinkExe可以进行内存读写操作,loadbin等操作,并且通过指定命令文件支持批量指令输入,那么首先jlink是可以直接访问内部存储器的,包 ...
- jquery——九宫格大转盘抽奖
一.用到的图片 二.代码如下,重点是js部分 <!DOCTYPE html> <html> <head> <meta http-equiv="Con ...
- python中strip,lstrip,rstrip简介
一.起因 今天在做角色控制中,有一个地方用到rstrip,判断用户请求的url是否与数据库对应可用权限中url相符. if request.path == x.url or request.path. ...