Ooura FFT算法代码

时间: 2023-10-04 19:04:19 浏览: 34
下面是Ooura FFT算法的C代码,其中包括了初始化、正向变换和反向变换函数: ```c #include <math.h> #define PI 3.14159265358979323846264338327L typedef struct { int n; int *ip; double *w; } ooura_fft_plan; void ooura_fft_init(ooura_fft_plan *p, int n) { p->n = n; p->ip = (int *)malloc(sizeof(int) * (2 + (int)sqrt(n / 2))); p->w = (double *)malloc(sizeof(double) * n / 2); int *ip = p->ip; double *w = p->w; int n1 = n - 1, nd2 = n / 2, i, j, k, n2, n4, n8; double c1 = 0.5, c2 = -0.5, t1, t2, t3, t4; if (ip[0] == 0) { n2 = n / 2; n4 = n / 4; n8 = n / 8; t1 = sin(PI / n); t2 = -2.0 * t1 * t1; t3 = sqrt(2.0) * t1; t4 = 2.0 * t3 * t1; w[0] = 1.0; w[n4] = c1 - c2; w[n2] = 0.0; w[n2 + n4] = c1 + c2; for (i = 1, j = n1; i < n8; i++, j--) { t1 = w[i - 1] * w[n4 + i - 1]; t2 = w[n4 - i - 1] * w[n2 + i - 1]; t3 = w[n2 - i - 1] * w[n2 + n4 - i - 1]; t4 = w[n4 + i - 1] * w[n2 + n4 - i - 1]; w[i] = t1 + c1 * t2 + c2 * t3; w[j] = c1 * t1 + t2 - t3 * c2; w[n2 - i] = c2 * t1 + t2 + c1 * t3; w[n2 + j] = c1 * t4 - c2 * t2; w[n2 + i] = c1 * t3 + t2 + c2 * t1; w[n2 + j - 1] = c2 * t4 + c1 * t2; } ip[0] = 1; } for (i = 1; i < (int)sqrt(n / 2); i++) { if (ip[i] == 0) { for (j = 0, k = 2 * i; k < n; j++, k += 2 * i) { ip[i + j] = k; } } } } void ooura_fft_forward(ooura_fft_plan *p, double *a) { int n = p->n, *ip = p->ip; double *w = p->w, t1, t2, r1, r2; int j, k, m; m = p->n / 2; for (j = 1, k = 0; j < n - 1; j++) { int i = ip[j]; if (i > j) { t1 = a[j * 2]; t2 = a[j * 2 + 1]; a[j * 2] = a[i * 2]; a[j * 2 + 1] = a[i * 2 + 1]; a[i * 2] = t1; a[i * 2 + 1] = t2; } k = m; while (k <= i) { i -= k; k /= 2; } if (k > j) { r1 = a[j * 2] + a[j * 2 + 1]; r2 = a[j * 2] - a[j * 2 + 1]; a[j * 2] = a[i * 2] + r2 * w[k - m]; a[j * 2 + 1] = a[i * 2 + 1] - r1 * w[k - m]; a[i * 2] -= r2 * w[k - m]; a[i * 2 + 1] += r1 * w[k - m]; } else { r1 = a[j * 2] + a[j * 2 + 1]; r2 = a[j * 2] - a[j * 2 + 1]; a[j * 2] = a[i * 2] + r1 * w[k - m]; a[j * 2 + 1] = a[i * 2 + 1] + r2 * w[k - m]; a[i * 2] -= r1 * w[k - m]; a[i * 2 + 1] -= r2 * w[k - m]; } } k = 2; for (m = n / 2; m > 2; m /= 2) { for (j = 0; j < m - 2; j += 2) { for (int i = j; i < n; i += k) { t1 = a[i * 2 + k] * w[(k / 2) - m]; t2 = a[i * 2 + k + 1] * w[(k / 2) - m]; a[i * 2 + k] = a[i * 2] - t1; a[i * 2 + k + 1] = a[i * 2 + 1] - t2; a[i * 2] += t1; a[i * 2 + 1] += t2; } } k *= 2; } } void ooura_fft_backward(ooura_fft_plan *p, double *a) { int n = p->n, *ip = p->ip; double *w = p->w, t1, t2, r1, r2; int j, k, m; m = p->n / 2; for (j = 1, k = 0; j < n - 1; j++) { int i = ip[j]; if (i > j) { t1 = a[j * 2]; t2 = a[j * 2 + 1]; a[j * 2] = a[i * 2]; a[j * 2 + 1] = a[i * 2 + 1]; a[i * 2] = t1; a[i * 2 + 1] = t2; } k = m; while (k <= i) { i -= k; k /= 2; } if (k > j) { r1 = a[j * 2] + a[j * 2 + 1]; r2 = a[j * 2] - a[j * 2 + 1]; a[j * 2] = a[i * 2] + r2 * w[k - m]; a[j * 2 + 1] = a[i * 2 + 1] - r1 * w[k - m]; a[i * 2] -= r2 * w[k - m]; a[i * 2 + 1] += r1 * w[k - m]; } else { r1 = a[j * 2] + a[j * 2 + 1]; r2 = a[j * 2] - a[j * 2 + 1]; a[j * 2] = a[i * 2] + r1 * w[k - m]; a[j * 2 + 1] = a[i * 2 + 1] + r2 * w[k - m]; a[i * 2] -= r1 * w[k - m]; a[i * 2 + 1] -= r2 * w[k - m]; } } k = 2; for (m = n / 2; m > 2; m /= 2) { for (j = 0; j < m - 2; j += 2) { for (int i = j; i < n; i += k) { t1 = a[i * 2 + k] * w[(k / 2) - m]; t2 = a[i * 2 + k + 1] * w[(k / 2) - m]; a[i * 2 + k] = a[i * 2] - t1; a[i * 2 + k + 1] = a[i * 2 + 1] - t2; a[i * 2] += t1; a[i * 2 + 1] += t2; } } k *= 2; } for (j = 0; j < n; j++) { a[j] /= n; } } ``` 使用方法: 1. 调用`ooura_fft_init`初始化FFT计算所需的内存 2. 将需要进行FFT变换的数据存储到`double`类型的数组中 3. 调用`ooura_fft_forward`进行正向变换,或`ooura_fft_backward`进行反向变换 4. 变换结果将存储在原始数据数组中,可以直接使用 此外,需要注意的是,该实现中的数组下标均从0开始,即第i个元素的下标为i-1,与其他实现可能有所不同。

相关推荐

最新推荐

recommend-type

DFT和FFT算法的比较

现在就从图中给出的算法中选定一种短DFT算法开始介绍。而且短DFT可以用Cooley-Tukey、Good-Thomas或Winograd提出的索引模式来开发长DFT。选择实现的共同目标就是将乘法的复杂性降到最低。这是一种可行的准则,因为...
recommend-type

基于Xilinx FPGA IP核的FFT算法的设计与实现

本文介绍了一种基于Xilinx IP核的FFT算法的设计与实现方法。在分析FFT算法模块图的基础上,以Xilinx Spartan-3A DSP系列FPGA为平台,通过调用FFT IP核,验证FFT算法在中低端FPGA中的可行性和可靠性。
recommend-type

用fft算法实现相关的MATLAB仿真

用fft算法实现相关的MATLAB仿真,该方法易于在FPGA上实现相关算法,比直接用相乘来得简单,而且但相关点数越多计算量相对而言比直接求解减少
recommend-type

模拟cooley-tukey FFT算法

模拟cooley-tukey FFT算法,此算法方便设计大点数FFT加速器
recommend-type

实数FFT算法的设计及其C语言实现

本人结合自己的实际开发经验,研究了实数的FFT算法并给出具体的C语言函数,读者可以直接应用于自己的系统中。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。