📄 4.txt
字号:
#include <complex>
typedef std::complex<double> Complex;
// 点 必须是2的幂
Fft::Fft (int Points, long sampleRate)
: _Points (Points), _sampleRate (sampleRate)
{
_sqrtPoints = sqrt((double)_Points);
//级算2进制的数字calculate binary log
_logPoints = 0;
Points--;
while (Points != 0)
{
Points >>= 1;
_logPoints++;
}
// 这里存放初始样本This is where the original samples will be stored
_aTape = new double [_Points];
for (int i = 0; i < _Points; i++)
_aTape[i] = 0;
// 这个是在适当位置的缓存器This is the in-place FFT buffer
_X = new Complex [_Points];
// 预计算的复杂复指数 Precompute complex exponentials for each stage
_W = new Complex * [_logPoints+1];
int _2_l = 2;
for (int l = 1; l <= _logPoints; l++)
{
_W[l] = new Complex [_Points];
for ( int i = 0; i < _Points; i++ )
{
double re = cos (2. * PI * i / _2_l);
double im = -sin (2. * PI * i / _2_l);
_W[l][i] = Complex (re, im);
}
_2_l *= 2;
}
// 准备字节反向映射prepare bit-reversed mapping
_aBitRev = new int [_Points];
int rev = 0;
int halfPoints = _Points/2;
for (i = 0; i < _Points - 1; i++)
{
_aBitRev[i] = rev;
int mask = halfPoints;
// add 1 backwards
while (rev >= mask)
{
rev -= mask; // turn off this bit
mask >>= 1;
}
rev += mask;
}
_aBitRev [_Points-1] = _Points-1;
}
-------------------
for (i = 0; i < _Points; i++)
PutAt (i, _aTape[i]);
------------------------
void Fft::PutAt (int i, double val)
{
_X [_aBitRev[i]] = Complex (val);
}
------------
//
// 0 1 2 3 4 5 6 7
// level 1
// step 1 0
// increm 2 W
// j = 0 <---> <---> <---> <---> 1
// level 2
// step 2
// increm 4 0
// j = 0 <-------> <-------> W 1
// j = 1 <-------> <-------> 2 W
// level 3 2
// step 4
// increm 8 0
// j = 0 <---------------> W 1
// j = 1 <---------------> 3 W 2
// j = 2 <---------------> 3 W 3
// j = 3 <---------------> 3 W
// 3
//
void Fft::Transform ()
{
// step = 2 ^ (level-1)
// increm = 2 ^ level;
int step = 1;
for (int level = 1; level <= _logPoints; level++)
{
int increm = step * 2;
for (int j = 0; j < step; j++)
{
// U = exp ( - 2 PI j / 2 ^ level )
Complex U = _W [level][j];
for (int i = j; i < _Points; i += increm)
{
// in-place butterfly
// Xnew[i] = X[i] + U * X[i+step]
// Xnew[i+step] = X[i] - U * X[i+step]
Complex T = U;
T *= _X [i+step];
_X [i+step] = _X[i];
_X [i+step] -= T;
_X [i] += T;
}
}
step *= 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -