C/C++ 实现FFT
来源:互联网 发布:猎虎88数据 编辑:程序博客网 时间:2024/06/16 05:52
说明:
1、默认FFT点数为2的整数次幂
2、把需要处理的数据放在Data[ ]数据中即可,DataReRank(int num)参数为FFT点数
3、编译工具:Visual Studio Professional 2013
#include<iostream>#include<list>#include<vector>using namespace std;float Data[] = {1,2,3,4,5,6,7,8};//进行FFT的数据struct Complex{ float imaginary; float real; };Complex ComplexMulti( Complex One, Complex Two); //复数乘法函数Complex StoreResult[sizeof(Data) / sizeof(float)]; //存储计算的结果void DataReRank(int num);void FFT();int DataLength = sizeof(Data) / sizeof(float); //数据长度const int PI = 3.1415926;int main(){DataReRank(8);FFT();for (auto data : StoreResult) cout << sqrt(pow(data.imaginary, 2) + pow(data.real, 2))<<endl;return 0;}void DataReRank(int num){int BitNum = log2(num);int flag = 1, index = 0, flag2 = 0;list<int> Bit; //存放二进制数,重复使用,每次用完需清零vector<float> DataTemp; //暂时存放重新排列过后的FFT数据for (int i = 0; i < num; i++){for (int j = 0; j < BitNum; j++){ //十进制转化为长度一致的二进制数int x = (i & flag)>0 ? 1 : 0;Bit.push_front(x);flag <<= 1;}for (auto it :Bit) index += it*pow(2, flag2++); //将原数组的索引倒序DataTemp.push_back(Data[index]);Bit.clear();flag = 1; flag2 = 0; index = 0;}for (int i = 0; i < num; i++) Data[i]=DataTemp[i]; //将DataTemp中数据复制到Data}Complex ComplexMulti(Complex One, Complex Two){Complex Temp;Temp.imaginary = One.imaginary *Two.real + One.real*Two.imaginary;Temp.real = One.real*Two.real - One.imaginary*Two.imaginary;return Temp;}void FFT(){int Level = log2(DataLength); //需要运算的级数Complex Temp,up;//先将数据转移到复数结构里for (int i = 0; i < DataLength; i++) StoreResult[i].real = Data[i];for (int i = 1; i <= Level; i++){Complex Factor; //定义旋转因子int BowknotDis = 2 << (i - 1); //没有交叉的蝶形结的距离int CalDis = BowknotDis / 2; //同一蝶形计算中两个数字的距离for (int j = 0; j < CalDis; j++) { //每一级蝶形运算中有CalDis个不同旋转因子Factor.real = cos(2 * PI /pow(2,i)*j);Factor.imaginary = -sin(2 * PI /pow(2,i)*j);for (int k = j; k < DataLength - 1; k += BowknotDis){Temp = ComplexMulti(Factor, StoreResult[k + CalDis]);up.imaginary = StoreResult[k].imaginary + Temp.imaginary;up.real = StoreResult[k].real + Temp.real;StoreResult[k + CalDis].imaginary = StoreResult[k].imaginary - Temp.imaginary;StoreResult[k + CalDis].real = StoreResult[k].real - Temp.real;StoreResult[k] = up;}}}}
对代码中的数据进行计算:
编译器:
Matlab:
代码的计算结果与matlab稍有偏差,不过可以看出代码的计算方法与结果是正确的
0 0
- C/C++ 实现FFT
- FFT 的C 语言实现
- FFT.c
- FFT快速算法及C语言实现
- FFT的C语言算法实现
- fft快速傅利叶变的C实现
- 8点FFT的C语言实现
- C语言实现FFT算法 - 开发手记
- fft算法的C语言实现
- FFT的C语言算法实现
- 二维FFT,IFFT,c语言实现
- FFT之数组逆序C语言实现
- 用c实现的fft和ifft
- FFT和IFFT的C代码实现
- 用c语言实现的FFT
- FFT变换的C语言实现
- C实现 快速傅立叶变换FFT FFT-1D FFT-2D 源代码
- FFT变换c代码
- Java 使用 iReport 导出报表
- LightOJ-1027
- poj 3744 Scout YYF I (矩阵快速幂+概率dp)
- AfxGetApp()和GetSafeHwnd()
- ZOJ 3785-What day is that day 解题报告
- C/C++ 实现FFT
- Otsu方法
- Ant之build.xml详解
- android混淆编译出错java.lang.Class cannot be cast to java.lang.reflect....
- Gperftools中tcmalloc的简介和使用
- ACM-计算几何之Segments——poj3304
- 机器学习中的算法(2)-支持向量机(SVM)基础
- 6.36③ 若已知两棵二叉树B1和B2皆为空,或者皆 不空且B1的左、右子树和B2的左、右子树分别相似, 则称二叉树B1和B2相似。试编写算法,判别给定两 棵二叉树是否相似。
- Hadoop深入学习:Combiner