zoukankan      html  css  js  c++  java
  • 用一个N点复序列的FFT同时计算两个N点实序列离散傅里叶变换

    一、功能

    用一个(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{egin{matrix}egin{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} ight. ]

    三、使用方法

    /************************************
    	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)的共轭对称性,很容易写
    				出后半部分的值。
    	y		----长度为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文件参见快速傅里叶变换

  • 相关阅读:
    C#8.0——异步流(AsyncStream)
    递归,循环,尾递归
    C#7.2——编写安全高效的C#代码
    Ocelot中文文档-Route
    Ocelot中文文档-Configuration
    Ocelot中文文档-Not Supported
    Ocelot中文文档-Getting Started
    .NET 单元测试的利剑——模拟框架Moq(简述篇)
    输入五个数字,按从大到小的顺序输出
    函数和方法的区别
  • 原文地址:https://www.cnblogs.com/liam-ji/p/11773973.html
Copyright © 2011-2022 走看看