单C文件中的FFT
我一直在寻找C语言中的FFT实现。然而,我不是在寻找一个巨大的库(比如FFTW),而是一个易于使用的C文件实现。不幸的是,我没能找到这样的东西单C文件中的FFT,c,fft,C,Fft,我一直在寻找C语言中的FFT实现。然而,我不是在寻找一个巨大的库(比如FFTW),而是一个易于使用的C文件实现。不幸的是,我没能找到这样的东西 有人能推荐一个简单的实现吗?你可以开始转换成C。作者说他是根据你在网上找到的书从C转换过来的 您的最佳选择是——顾名思义,它的速度非常快,而且比FFTW轻得多。它也是免费的,如果你想将它包含在商业产品中,FFTW需要支付高额的许可费。,每个文件都包含在自己独立的C文件中。此文件可以正常工作:只需在计算机中复制和粘贴即可。 在网上冲浪时,我在维基百科页面上
有人能推荐一个简单的实现吗?你可以开始转换成C。作者说他是根据你在网上找到的书从C转换过来的 您的最佳选择是——顾名思义,它的速度非常快,而且比FFTW轻得多。它也是免费的,如果你想将它包含在商业产品中,FFTW需要支付高额的许可费。,每个文件都包含在自己独立的C文件中。此文件可以正常工作:只需在计算机中复制和粘贴即可。 在网上冲浪时,我在维基百科页面上发现了这个简单的实现。页面是意大利语的,所以我用一些翻译重新编写了代码。这些信息几乎都是用英语写的。享受吧
#include <iostream>
#include <complex>
#define MAX 200
using namespace std;
#define M_PI 3.1415926535897932384
int log2(int N) /*function to calculate the log2(.) of int numbers*/
{
int k = N, i = 0;
while(k) {
k >>= 1;
i++;
}
return i - 1;
}
int check(int n) //checking if the number of element is a power of 2
{
return n > 0 && (n & (n - 1)) == 0;
}
int reverse(int N, int n) //calculating revers number
{
int j, p = 0;
for(j = 1; j <= log2(N); j++) {
if(n & (1 << (log2(N) - j)))
p |= 1 << (j - 1);
}
return p;
}
void ordina(complex<double>* f1, int N) //using the reverse order in the array
{
complex<double> f2[MAX];
for(int i = 0; i < N; i++)
f2[i] = f1[reverse(N, i)];
for(int j = 0; j < N; j++)
f1[j] = f2[j];
}
void transform(complex<double>* f, int N) //
{
ordina(f, N); //first: reverse order
complex<double> *W;
W = (complex<double> *)malloc(N / 2 * sizeof(complex<double>));
W[1] = polar(1., -2. * M_PI / N);
W[0] = 1;
for(int i = 2; i < N / 2; i++)
W[i] = pow(W[1], i);
int n = 1;
int a = N / 2;
for(int j = 0; j < log2(N); j++) {
for(int i = 0; i < N; i++) {
if(!(i & n)) {
complex<double> temp = f[i];
complex<double> Temp = W[(i * a) % (n * a)] * f[i + n];
f[i] = temp + Temp;
f[i + n] = temp - Temp;
}
}
n *= 2;
a = a / 2;
}
free(W);
}
void FFT(complex<double>* f, int N, double d)
{
transform(f, N);
for(int i = 0; i < N; i++)
f[i] *= d; //multiplying by step
}
int main()
{
int n;
do {
cout << "specify array dimension (MUST be power of 2)" << endl;
cin >> n;
} while(!check(n));
double d;
cout << "specify sampling step" << endl; //just write 1 in order to have the same results of matlab fft(.)
cin >> d;
complex<double> vec[MAX];
cout << "specify the array" << endl;
for(int i = 0; i < n; i++) {
cout << "specify element number: " << i << endl;
cin >> vec[i];
}
FFT(vec, n, d);
cout << "...printing the FFT of the array specified" << endl;
for(int j = 0; j < n; j++)
cout << vec[j] << endl;
return 0;
}
#包括
#包括
#定义最大值200
使用名称空间std;
#定义M_PI 3.1415926535897932384
int log2(int N)/*函数,用于计算整数的log2(.)*/
{
int k=N,i=0;
while(k){
k>>=1;
i++;
}
返回i-1;
}
int check(int n)//检查元素数是否为2的幂
{
返回n>0&(n&(n-1))==0;
}
int reverse(int N,int N)//计算反向数
{
int j,p=0;
对于(j=1;j试试。但是FFTW有什么不容易使用的地方?你的意思是容易理解源代码吗?写你自己的。这将是一个很好的练习。互联网上充满了关于如何计算DFT和FFT的解释。使用它。FFT例程的代码不到一百行。该库实现了快速傅里叶变换(FFT)的正向和反向同时使用时间抽取(DIT)和频率抽取(DIF)的算法。@DaBler这正是我要搜索的!谢谢!除非你重新分发它,而不是在GPL下发布源代码…这工作得出奇地好。这不是世界上最有效的代码,但它肯定能工作!