我差不多一个月一直在和一个非常奇怪的虫子打架.问你们这是我最后的希望.我在C中编写了一个程序,它使用傅里叶(或倒数)空间中的隐式欧拉(IE)方案集成了2d Cahn-Hilliard方程:
"帽子"意味着我们处于傅里叶空间:h_q(t_n + 1)和h_q(t_n)是时间t_n和t_(n + 1)的h(x,y)的FT,N [h_q]是非线性算子应用于傅立叶空间中的h_q,而L_q是线性的,同样在傅立叶空间中.我不想过多介绍我使用的数值方法的细节,因为我确信问题不是来自那里(我尝试使用其他方案).
我的代码实际上非常简单.这是开始,基本上我声明变量,分配内存并为FFTW例程创建计划.
# include <stdlib.h>
# include <stdio.h>
# include <time.h>
# include <math.h>
# include <fftw3.h>
# define pi M_PI
int main(){
// define lattice size and spacing
int Nx = 150; // n of points on x
int Ny = 150; // n of points on y
double dx = 0.5; // bin size on x and y
// define simulation time and time step
long int Nt = 1000; …Run Code Online (Sandbox Code Playgroud) 我在matlab中心发布了这个,但没有得到任何回复所以我想我会转发到这里.
我最近在Matlab中编写了一个简单的例程,它在for循环中使用FFT; FFT主导了计算.我在mex中编写了相同的例程仅用于实验目的,它调用了FFTW 3.3库.事实证明,对于非常大的数组,matlab例程比mex例程运行得更快(大约快两倍).mex例程使用智慧并执行相同的FFT计算.我也知道matlab使用FFTW,但它们的版本是否可能稍微优化一下?我甚至使用了FFTW_EXHAUSTIVE标志,它对大型数组的速度仍然是MATLAB的两倍.此外,我确保我使用的matlab是单线程的"-singleCompThread"标志,我使用的mex文件不在调试模式.只是好奇,如果是这种情况 - 或者如果有一些优化,matlab正在使用我不知道的引擎盖.谢谢.
这是mex部分:
void class_cg_toeplitz::analysis() {
// This method computes CG iterations using FFTs
// Check for wisdom
if(fftw_import_wisdom_from_filename("cd.wis") == 0) {
mexPrintf("wisdom not loaded.\n");
} else {
mexPrintf("wisdom loaded.\n");
}
// Set FFTW Plan - use interleaved FFTW
fftw_plan plan_forward_d_buffer;
fftw_plan plan_forward_A_vec;
fftw_plan plan_backward_Ad_buffer;
fftw_complex *A_vec_fft;
fftw_complex *d_buffer_fft;
A_vec_fft = fftw_alloc_complex(n);
d_buffer_fft = fftw_alloc_complex(n);
// CREATE MASTER PLAN - Do this on an empty vector as creating a plane
// with FFTW_MEASURE will erase the …Run Code Online (Sandbox Code Playgroud) Python中最快的FFT实现是什么?
似乎numpy.fft和scipy.fftpack都基于fftpack,而不是FFTW.fftpack和FFTW一样快吗?如何使用多线程FFT或使用分布式(MPI)FFT?
我想制作一个程序,用PortAudio录制音频数据(我完成了这部分),然后显示录制音频的频率信息(现在,我想显示每组样本的平均频率)因为他们进来了).
从我做过的一些研究中,我知道我需要进行FFT.所以我用谷歌搜索了一个库,用C语言,找到了FFTW.
但是,现在我有点失落了.我应该怎么处理我记录的样本以从中提取一些频率信息?我应该使用什么样的FFT(我假设我需要一个真实的数据1D?)?
一旦我进行了FFT,如何从它给出的数据中获取频率信息?
编辑:我现在也发现了自相关算法.好点吗?更简单?
非常感谢,对不起,如果这样,我绝对没有经验.我希望它至少有点意义.
FFTW手册说它的fftw_complex类型std::complex<double>与STL中的类有点兼容.但这对我不起作用:
#include <complex>
#include <fftw3.h>
int main()
{
std::complex<double> x(1,0);
fftw_complex fx;
fx = reinterpret_cast<fftw_complex>(x);
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
error: invalid cast from type ‘std::complex<double>’ to type ‘double [2]’
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我正在为最新版本的FFTW寻找一个最小的Java包装器.在FFTW网站上列出的包装器要么过时(jfftw-1.2.zip),要么包含太多额外的东西(Shared Scientific Toolbox).谷歌搜索建议JFFTW3看起来很有前景,但下载链接已经破了(有人有镜子吗?)
对于那些想要纯Java FFT库的人来说,JTransforms看起来非常好.我更喜欢使用FFTW,因为它大约快两倍,它处理任意尺寸d> 3.
我们说我有一个WAV文件.在此文件中,是精确1秒间隔的一系列正弦音.我想使用FFTW库按顺序提取这些音调.这特别难吗?我该怎么做?
另外,将这种音调写入WAV文件的最佳方法是什么?我假设我只需要一个简单的音频库来输出.
我选择的语言是C.
编辑:我解决了这个问题,解决方案如下.
我正在专用于科学计算的共享计算集群中构建代码,因此我只能控制主文件夹中的文件.虽然我使用fftw作为示例,但我想了解具体原因,为什么我尝试设置LD_LIBRARY_PATH不起作用.
我在我的主文件夹中构建了fftw和fftw_mpi库
./configure --prefix=$HOME/install/fftw --enable-mpi --enable-shared
make install
Run Code Online (Sandbox Code Playgroud)
它构建正常,但在install/fftw/lib中,我发现新构建的libfftw3_mpi.so链接到错误版本的fftw库.
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f7df0979000)
Run Code Online (Sandbox Code Playgroud)
如果我现在尝试将LD_LIBRARY_PATH设置为正确指向此目录,它仍然更喜欢错误的库:
$ export LD_LIBRARY_PATH=$HOME/install/fftw/lib
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f32b4794000)
Run Code Online (Sandbox Code Playgroud)
只有我明确使用LD_PRELOAD,我才能覆盖此行为.我不认为LD_PRELOAD是一个合适的解决方案.
$ export LD_PRELOAD=$HOME/install/fftw/lib/libfftw3.so.3
$ ldd libfftw3_mpi.so |grep fftw
$HOME/install/fftw/lib/libfftw3.so.3 (0x00007f5ca3d14000)
Run Code Online (Sandbox Code Playgroud)
这是我期望的,在Ubuntu桌面上进行的一个小测试,我首先将fftw安装到/ usr/lib,然后使用LD_LIBRARY_PATH覆盖此搜索路径.
$ export LD_LIBRARY_PATH=
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => /usr/lib/x86_64-linux-gnu/libfftw3.so.3
$ export LD_LIBRARY_PATH=$HOME/install/fftw-3.3.4/lib
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => $HOME/install/fftw-3.3.4/lib/libfftw3.so.3
Run Code Online (Sandbox Code Playgroud)
简而言之:为什么libfft3_mpi库仍然找到错误的动态fftw3库?此搜索路径在何处以这样的方式进行硬编码,使其优先于LD_LIBARY_PATH?为什么在另一台计算机上不是这种情况?
如果这很重要,我正在使用英特尔编译器13.1.2,mkl 11.0.4.183和openmpi 1.6.2.
编辑:谢谢你的所有答案.在这些帮助下,我们能够将问题隔离到RPATH,从那里,集群支持能够找出问题所在.我接受了第一个答案,但两个答案都很好.
之所以这么难以理解,原因是我们不知道编译器实际上是包装脚本,而是向编译器命令行添加内容.这是支持部门的回复的一部分:
[编译]通过我们的编译器包装器进行编译.我们默认执行RPATH,因为它可以帮助大多数用户正确运行他们的作业而不加载LD-LIBRARY_PATH等.但是我们从默认的RPATH中排除某些库路径,包括/ lib,/ lib64/proj/home等./ usr之前错误地(大多数情况下)没有排除/ lib64.现在我们在排除列表中添加了该路径.
我有一个以列主要(Fortran风格)格式存储的2D数据库,我想对每一行进行FFT .我想避免转置数组(它不是正方形).例如,我的数组
fftw_complex* data = new fftw_complex[21*256];
Run Code Online (Sandbox Code Playgroud)
包含条目[r0_val0, r1_val0,..., r20_val0, r0_val1,...,r20_val255].
我可以用它fftw_plan_many_dft来制定一个计划来解决data数组中的21个FFT中的每个FFT,如果它是行 -主要的,例如[r0_val0, r0_val1,..., r0_val255, r1_val0,...,r20_val255]:
int main() {
int N = 256;
int howmany = 21;
fftw_complex* data = new fftw_complex[N*howmany];
fftw_plan p;
// this plan is OK
p = fftw_plan_many_dft(1,&N,howmany,data,NULL,1,N,data,NULL,1,N,FFTW_FORWARD,FFTW_MEASURE);
// do stuff...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据文档(FFTW手册第4.4.1节),该功能的签名是
fftw_plan fftw_plan_many_dft(int rank, const int *n, int howmany,
fftw_complex *in, const int *inembed,
int istride, int idist, …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个简单的C应用程序,它可以在WAV文件中的给定时间戳下在特定频率范围内给出0-100的值.
示例:我的频率范围为44.1kHz(典型的MP3文件),我想将该范围分成n个范围(从0开始).然后我需要得到每个范围的幅度,从0到100.
到目前为止我管理的内容:
使用libsndfile我现在能够读取WAV文件的数据.
infile = sf_open(argv [1], SFM_READ, &sfinfo);
float samples[sfinfo.frames];
sf_read_float(infile, samples, 1);
Run Code Online (Sandbox Code Playgroud)
但是,我对FFT的理解相当有限.但我知道为了使振幅达到我需要的范围是必需的.但是我该如何继续前进呢?我找到了FFTW-3库,它似乎适用于此目的.
我在这里找到了一些帮助:https://stackoverflow.com/a/4371627/1141483
并在这里查看了FFTW教程:http://www.fftw.org/fftw2_doc/fftw_2.html
但由于我不确定FFTW的行为,我不知道从这里开始.
另一个问题,假设您使用libsndfile:如果强制读取单引导(使用立体声文件)然后读取样本.那么你真的只会阅读总文件的一半样本吗?其中一半来自频道1,还是自动过滤出来?
非常感谢您的帮助.
编辑:我的代码可以在这里看到:
double blackman_harris(int n, int N){
double a0, a1, a2, a3, seg1, seg2, seg3, w_n;
a0 = 0.35875;
a1 = 0.48829;
a2 = 0.14128;
a3 = 0.01168;
seg1 = a1 * (double) cos( ((double) 2 * (double) M_PI * (double) n) / ((double) N - (double) 1) );
seg2 = a2 * (double) cos( …Run Code Online (Sandbox Code Playgroud)