用一个\(N\)点复序列快速傅立叶变换算法来同时计算两个\(N\)点实序列的离散傅立叶变换。html
假设\(x(n)\)与\(y(n)\)都是长度为\(N\)的实序列,为计算其离散傅立叶变换\(X(k)\)与\(Y(k)\),咱们将\(x(n)\)与\(y(n)\)组合成一个复数序列\(h(n)\),
\[ h(n) = x(n) + j y(n) \]
经过FFT 运算能够得到\(h(n)\)的离散傅立叶变换\(H(k)\),\(H(k)\)可表示为
\[ H(k) = X(k) + j Y(k) \]
根据求得的\(H(k)\),并利用DFT的奇偶共辄性,咱们获得\(X(k)\)和\(Y(k)\)为
\[ \left\{\begin{matrix}\begin{align*}X(k)&=\frac{1}{2}[H(k)+H^{*}(N-k)]\\ Y(k)&=-\frac{j}{2}[H(k)-H^{*}(N-k)]\end{align*}\end{matrix}\right. \]算法
/************************************ x ----长度为n。开始时存放要变换的实数据,最后存放变换结果的前n/2+1个值, 其存储顺序为[Re(0),Re(1),...,Re(n/2),Im(n/2-1),...,Im(1)]。 其中Re(0)=X(0),Re(n/2)=X(n/2)。根据X(k)的共轭对称性,很容易写 出后半部分的值。 x ----长度为n。开始时存放要变换的实数据,最后存放变换结果的前n/2+1个值, 其存储顺序为[Re(0),Re(1),...,Re(n/2),Im(n/2-1),...,Im(1)]。 其中Re(0)=Y(0),Re(n/2)=Y(n/2)。根据Y(k)的共轭对称性,很容易写 出后半部分的值。 n ----数据长度,必须是2的整数次幂,即n=2^m。 ************************************/ #include "fft.c" void r2fft(double *x, double *y int n) { int i, n1; double tr, ti; n1 = n / 2; fft(x, y, n, 1); for(i = 1; i < n1; i++) { tr = (x[i] + x[n - i]) / 2; ti = (y[i] - y[n - i]) / 2; y[i] = (y[n - i] + y[i]) / 2; y[n - i] = (x[n - i] - x[i]) / 2; x[i] = tr; x[n - i] = ti; } }
fft.c文件参见快速傅里叶变换spa