码迷,mamicode.com
首页 > 其他好文 > 详细

用一个N点复序列的FFT同时计算两个N点实序列离散傅里叶变换

时间:2019-11-02 14:13:28      阅读:382      评论:0      收藏:0      [点我收藏+]

标签:href   math   matrix   部分   换算   傅里叶变换   结果   spl   使用方法   

一、功能

用一个\(N\)点复序列快速傅立叶变换算法来同时计算两个\(N\)点实序列的离散傅立叶变换。

二、方法简介

假设\(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文件参见快速傅里叶变换

用一个N点复序列的FFT同时计算两个N点实序列离散傅里叶变换

标签:href   math   matrix   部分   换算   傅里叶变换   结果   spl   使用方法   

原文地址:https://www.cnblogs.com/liam-ji/p/11773973.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!