我正在尝试将FFTW3(用C编写的GNU FFT库,http: //www.fftw.org/ )集成到iPhone应用程序中.我下载了源代码,发现有数百个.h和.c文件以及许多其他我无法识别的文件.我不是linux专家,所以我真的不明白.configure文件和其他类似文件是如何工作的.由于没有像filename.xcodeproj这样的文件,我需要自己设置XCode项目.
我想知道的是: 如何在XCode中获取文件并编译它们而不会出错?有经验或提示吗?
我正在尝试将第三方库(如fftw3和sndfile)链接到Xcode3.2中的我的iPhone项目.我通过在项目构建配置下将"Header Search Path"设置为"/ usr/local/include"并将"Other Linker Flags"设置为"-lfftw3 -lsndfile",使其在常规Mac项目中工作.但是,当我尝试使用相同的设置在iPhone项目中构建它时,它给出了"找不到-lfftw3库"和退出代码1错误消息.
苹果在iPhone上不允许这样吗?有办法解决这个问题吗?
我正在尝试使用FFT加速神经模拟器的计算.
等式是:
(1)\ sum(j = 1到N)(w(i-j)*s_NMDA [j])
其中s_NMDA是长度为N的向量,w由以下定义:
(2)W(j)的双曲正切= [1 /(2*西格玛*P)]*EXP(-abs(J)/(西格玛*P)]
sigma和p是常量.
(有没有更好的方法在stackoverflow上呈现方程?)
必须对N个神经元进行计算.由于(1)仅取决于绝对距离abs(i-j),因此应该可以使用FFT(卷积定理)来计算它.
我试图使用FFTW实现这一点,但结果与预期结果不符.我之前从未使用过FFTW,现在我不确定如果我对卷积定理的假设是假的,那么我的实现是不正确的.
void f_I_NMDA_FFT(
const double **states, // states[i][6] == s_NMDA[i]
const unsigned int numNeurons)
{
fftw_complex *distances, *sNMDAs, *convolution;
fftw_complex *distances_f, *sNMDAs_f, *convolution_f;
fftw_plan p, pinv;
const double scale = 1./numNeurons;
distances = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
sNMDAs = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
convolution = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
distances_f = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
sNMDAs_f = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
convolution_f = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * …Run Code Online (Sandbox Code Playgroud) 我使用fftw/C++和在线计算器计算了数组{1,2,3,4,5,6}的FFT(http://calculator-fx.com/calculator/fast-fourier-transform-calculator-fft/ 1d离散傅立叶变换).结果似乎有点不同.
fftw输出:
Run Code Online (Sandbox Code Playgroud)0 21.000000 0.000000 1 -3.000000 5.196152 2 -3.000000 1.732051 3 -3.000000 0.000000 4 0.000000 0.000000 5 0.000000 0.000000
在线计算器输出:
Run Code Online (Sandbox Code Playgroud)21 + 0j -3 + 5.196152j -3 + 1.732051j -3 + 0j -3 - 1.732051j -3 - 5.196152j
如上所示,fftw的后两个结果变为零.无法弄清楚为什么.有人可以帮帮我吗?谢谢.
[编辑] cpp代码:
int main()
{
fftw_complex *out;
fftw_plan plan;
double arr[]={1,2,3,4,5,6};
int n = sizeof(arr)/sizeof(double);
out = (fftw_complex*)fftw_malloc ( sizeof ( fftw_complex ) * n );
plan = fftw_plan_dft_r2c_1d ( n, arr, out, FFTW_ESTIMATE );
fftw_execute ( …Run Code Online (Sandbox Code Playgroud) 我想更好地了解FFTW的API.FFTW是用于在一个或多个维度上计算离散傅里叶变换(DFT)的库.
现在,假设我有一个正弦波形x = 30*sin(2*M_PI*f*i*T),其中f是频率(例如f = 1000Hz).如果我使用FFTW的功能来分析我的波形,我希望得到一个频率f = 1000Hz.
我的问题是如何使用FFTW库在c ++中执行此操作?任何帮助,将不胜感激.
我正在尝试使用Microsoft Visual Studio编译FFTW.我有2010 Express和Community 2013版本.我从http://www.fftw.org/install/windows.html下载文件.我打开解决方案,选择项目libfftw-3.3并且出现错误"无法找到Windows7.1SDK(Platform Toolset ='Windows7.1SDK')的构建工具"在属性中我将Platform Toolset更改为Visual Studio 2013.当我尝试构建时,它找不到fftw_mkprinter_cnt和fftw_mkprinter_str.当我将Platform Toolset更改为Visual Studio 2010时出错"无法打开文件VCOMPD.lib".当我尝试忽略这个库时,像以前一样出现错误(fftw_mkprinter_cnt和fftw_mkprinter_str)如何编译这个库
我正在将旧的 Fortran 代码库转换/重写为现代代码库。代码库的其中一段使用 Fourn 子程序(来自 Numerical receipies book)用于 FFT 目的。但是当我试图用 FFTW 库做那件事时,它不会产生相同的结果。我在这里很困惑。您可以在此处找到输入数据的代码: https //github.com/Koushikphy/fft_test/tree/master/notworking
使用的代码fourn:
program test
implicit none
integer, parameter :: n=65536
complex(kind=8) ::inp(n) = 0.0d0
real(kind=8) :: sn, urt(2*n)
integer :: i, ii
sn = 1.0d0/sqrt(real(n,kind=8))
do i=1,9070
read(75,'(i4, 2f20.16)') ii, inp(i)
enddo
do i=1,n
urt(2*i-1)= real(inp(i))
urt(2*i) = aimag(inp(i))
enddo
! forward
call fourn(urt,[n],1,1)
do i=1,n
write(201,'(i4, 2f20.16)')i, urt(2*i-1), urt(2*i)
enddo
end program test
SUBROUTINE FOURN(DATA,NN,NDIM,ISIGN)
INTEGER ISIGN,NDIM,NN(NDIM)
! C REAL DATA(*)
DOUBLE PRECISION DATA(*) …Run Code Online (Sandbox Code Playgroud) 我使用FFTW生成系数,现在我想重建原始数据,但只使用第一个numCoefs系数而不是全部系数.目前我正在使用下面的代码,这是非常慢的:
for ( unsigned int i = 0; i < length; ++i )
{
double sum = 0;
for ( unsigned int j = 0; j < numCoefs; ++j )
{
sum += ( coefs[j][0] * cos( j * omega * i ) ) + ( coefs[j][1] * sin( j * omega * i ) );
}
data[i] = sum;
}
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?
我听说/读过,如果我们有一些n FFT 来执行一些m 个向量,我们可以使用 cuFFT 的批处理模式。所以为了测试它,我制作了一个示例程序并运行它。我使用的数据是一个文件,其中包含一些1024浮点数,因为相同的1024数字重复了10多次。虽然1024点 FFT应该得到相同的结果,但我没有得到。如果我在某处概念上有错误,请纠正我,下面是代码,如果你能纠正我犯的一些错误。
注意:我只使用 1D FFT。
这是代码片段:
#include <cuda.h>
#include <cufft.h>
#include <stdio.h>
#include <math.h>
#define NX 1024
#define DATASIZE 1024
#define BATCH 10
int main (int argc, char* argv[])
{
cufftHandle plan;
cufftComplex *deviceOutputData, *hostOutputData;
cufftReal *hostInputData, *deviceInputData;
int i,j;
FILE *in; // *out, *fp;
cudaMalloc ((void**)&deviceInputData, NX*BATCH*sizeof(cufftReal));
hostInputData = (cufftReal*) malloc (NX*BATCH*sizeof(cufftReal));
cudaMalloc ((void**)&deviceOutputData, NX*BATCH*sizeof(cufftComplex));
hostOutputData = (cufftComplex*) malloc (NX*BATCH*sizeof(cufftComplex));
in = fopen …Run Code Online (Sandbox Code Playgroud) 我目前需要在1024个采样点信号上运行FFT.到目前为止,我已经在python中实现了我自己的DFT算法,但它非常慢.如果我使用NUMPY fftpack,甚至转移到C++并使用FFTW,你们认为它会更好吗?
我只是按照这里的说明更新我的gcc。现在,我正在尝试安装FFTW。所以我在这里下载了文件。解压缩并导航到该目录后,运行以下命令:
./configure --enable-mpi --enable-threads --enable-openmp
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
checking for OpenMP flag of C compiler... unknown
configure: error: don't know how to enable OpenMP
Run Code Online (Sandbox Code Playgroud)
我知道OpenMP在更新GCC之前不起作用,但是如果我这样做,现在它可以工作:
export PATH=/usr/local/gcc-6.1.0/bin:$PATH
gcc-6.1.0 main.c -o main
Run Code Online (Sandbox Code Playgroud)
所以我猜测问题是,当我尝试配置FFTW时,它使用的是默认gcc,但我需要使用gcc-6.1.0。我怎样才能做到这一点?