- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是从事电信项目的计算机程序员。
在我们的项目中,我必须将一系列复数更改为它们的傅立叶变换。因此我需要一个高效的 FFT
代码来满足 C89
标准。
我正在使用以下代码,它运行良好:
short FFT(short int dir,long m,double *x,double *y)
{
long n,i,i1,j,k,i2,l,l1,l2;
double c1,c2,tx,ty,t1,t2,u1,u2,z;
/* Calculate the number of points */
n = 1;
for (i=0;i<m;i++)
n *= 2;
/* Do the bit reversal */
i2 = n >> 1;
j = 0;
for (i=0;i<n-1;i++) {
if (i < j) {
tx = x[i];
ty = y[i];
x[i] = x[j];
y[i] = y[j];
x[j] = tx;
y[j] = ty;
}
k = i2;
while (k <= j) {
j -= k;
k >>= 1;
}
j += k;
}
/* Compute the FFT */
c1 = -1.0;
c2 = 0.0;
l2 = 1;
for (l=0;l<m;l++) {
l1 = l2;
l2 <<= 1;
u1 = 1.0;
u2 = 0.0;
for (j=0;j<l1;j++) {
for (i=j;i<n;i+=l2) {
i1 = i + l1;
t1 = u1 * x[i1] - u2 * y[i1];
t2 = u1 * y[i1] + u2 * x[i1];
x[i1] = x[i] - t1;
y[i1] = y[i] - t2;
x[i] += t1;
y[i] += t2;
}
z = u1 * c1 - u2 * c2;
u2 = u1 * c2 + u2 * c1;
u1 = z;
}
c2 = sqrt((1.0 - c1) / 2.0);
if (dir == 1)
c2 = -c2;
c1 = sqrt((1.0 + c1) / 2.0);
}
/* Scaling for forward transform */
if (dir == 1) {
for (i=0;i<n;i++) {
x[i] /= n;
y[i] /= n;
}
}
return(true);
}
但是这段代码,只支持大小为2^m
的数组。如CLRS
书本代码。
我们应该转换的数组不在这个范围内,添加零会很昂贵,所以我正在寻找另一种解决方案来帮助我输入任何大小。
类似于 IT++
和 matlab
所做的事情。但正如我们希望在纯 C 中使用它们是不可能的。此外,IT++
代码在我检查时被阻止
最佳答案
如果您正在使用任何大众市场计算平台(带有 Windows 或 OS X、iOS 等的英特尔),那么供应商或制造商会提供高性能 FFT 实现。
否则,你应该评估FFTW .
为除 2 的幂以外的大小编写高性能 FFT 是一项复杂的任务。
如果您要使用自己的实现,那么,关于二次方大小:
您展示的实现在 FFT 期间计算 sqrt
。大多数高性能 FFT 实现提前计算常量并将它们存储在表中。
缩放包含除法运算,在 x[i]/= n
和 y[i]/= n
中。编译器很可能将这些实现为除法指令。除法在普通处理器上通常是一条缓慢的指令。计算一次 scale = 1./n
并乘以 scale
而不是除以 n
会更好。
更好的办法是完全省略比例。转换通常在没有比例的情况下很有用,或者可以从单个转换中省略比例并仅作为聚合比例应用一次。 (例如,与其执行两个缩放操作,一个在正向 FFT 中,一个在反向 FFT 中,将缩放操作从 FFT 例程中移除,并在正向 FFT 和反向 FFT 之后只执行一次。)
如果可以接受按位反转顺序排列频域数据,则您可以省略位反转排列。
如果保留位反转排列,则可以对其进行优化。执行此操作的技术取决于平台。某些平台有反转整数位的指令(例如,ARM 有 rbit
)。如果您的平台没有,您可能希望将位反转索引保存在表中或研究比当前代码更快地计算它们的方法。
如果同时保留位反转排列和缩放,则应考虑同时进行。排列使用大量内存运动,缩放使用处理器的算术单元。大多数现代处理器可以同时执行这两项操作,因此您可以从重叠操作中获益。
您当前的代码使用 radix-2 butterfly。 Radix-4 通常更好,因为它从以下事实中获得了一些优势:只需更改使用的数据片段并将一些加法更改为减法,反之亦然即可完成与 i 的乘法。
如果您的数组长度接近处理器上一级内存缓存的大小,FFT 实现的某些部分将扰动缓存并显着降低速度,除非您设计适当的代码来处理这个问题(通常通过将数组的部分复制到一个临时缓冲区)。
如果您的目标处理器具有 SIMD 功能,您绝对应该在 FFT 中使用这些功能;它们极大地加快了 FFT 性能。
以上内容应该告诉您,编写高效的 FFT 是一项复杂的任务。除非您想为此花费大量精力,否则最好使用 FFTW 或其他现有实现。
关于c - FFT 和 FFT 的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18341613/
要在 R 中绘制正态分布曲线,我们可以使用: (x = seq(-4,4, length=100)) y = dnorm(x) plot(x, y) 如 dnorm将 y 计算为 x 的函数,R 是否
@XmlTransient 阻止将 JavaBeans 属性映射到 XML 表示。是否存在与此相反的情况,这意味着即使 WebService 未使用的方法也会被映射?如果这不可能,是否存在解决方法?
我有以下键数组: var keys = [{userId: "333"}, {userId: "334"}] 这个对象数组: var users = [ {id: "333", firstName:
我正在寻找将字符串转换为类型的通用方法。 例如: class SomeThing { public void Add(T value) { //... } pub
我看到了this question , 并弹出这个想法。 有没有一种在 PHP 中执行此操作的有效方法? 编辑 有演示最好吗? 最佳答案 你可以使用 pear 包 Math_Matrix为此。 关于矩
如何在 python 中求逆矩阵?我自己实现了它,但它是纯 python,我怀疑那里有更快的模块可以做到这一点。 最佳答案 你应该看看 numpy如果您进行矩阵操作。这是一个主要用C语言编写的模块,比
是否有比使用 IF ELSE 构造更简单的方法来反转 bool 值? 通常我会使用! bool 值前面。但这在 Navision 中不起作用 最佳答案 您可以使用 NOT 关键字代替 !。 关于nav
假设我有一个对象响应。现在我想检查一个 bool 变量,success,在 Response 下并做一个早期返回是 response 不成功。 if(response == null || !resp
任何人都可以提供/引用多维行主要顺序的“索引->偏移”*转换的倒数。此外,(伪)代码将不胜感激。 http://en.wikipedia.org/wiki/Row-major_order 举个例子,简
我有一个看起来像这样的系统: z1 = 5*x1 + x2*cos(x3) z2 = x1*sin(x3) + 3*x2 z3 = 3*x1 - 2*x2 这是微分方程组的变换(只是为了提供一些背景信
我正在使用org.apache.commons.math3.transform类FastFourierTransformer,我现在尝试在真实数据集上应用FFT,并应用逆FFT来获取原始数据集。我的问
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
背景 我需要使用已知的累积分布函数 (CDF) 从相当复杂的概率密度函数 (PDF) 中随机采样,并且我正在尝试使用 inverse transform sampling 。这应该很容易做到,因为我有
是否有任何 System.identityHashCode (object) 的逆函数能够从 System.identityHashCode (object) 的结果中提供对象的值? 最佳答案 Sys
有没有办法在mysql中获取group by语句的逆?我的用例是删除所有重复项。 假设我的表格如下所示: ID | columnA | ... 1 | A 2 | A 3 | A 4
我有一个查询,它给我一个公司列表(tblprov)及其相应的类别(tblrubro) 两个表通过查找表 (tblprovxrubro) 相关 SELECT p.id, p.name, r.idCat,
我有一个 jpg 图像,在矩形中有一个圆形物体,我想使圆形物体的环境透明... (本例去除红色区域) 借助这个iOS make part of an UIImage transparent和“UIBe
我想知道是否可以在不需要临时数组的情况下通过 Cholesky 分解获得矩阵的逆。截至目前,我可以在不使用临时数组的情况下进行 cholesky 分解,但从那里我还没有想出一种方法来获得原始矩阵的逆矩
是否可以在 Angular 中使用逆$watch? 我的问题 我使用 Angular-translate,并且我想对每个缺少的翻译使用 $http.put 。但我收到此错误: "10 $digets(
我正在执行 radix-2 dif 逆 fft。我正在使用共轭和缩放的属性来返回结果。我共轭我的输入 vector ,执行常规 radix-2 fft(不是 ifft),共轭结果,然后按 1.0/N
我是一名优秀的程序员,十分优秀!