标签: fftw

为什么(A + B)的FFT与FFT(A)+ FFT(B)不同?

我差不多一个月一直在和一个非常奇怪的虫子打架.问你们这是我最后的希望.我在C中编写了一个程序,它使用傅里叶(或倒数)空间中的隐式欧拉(IE)方案集成了2d Cahn-Hilliard方程:

IE方法

"帽子"意味着我们处于傅里叶空间: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)

c fftw pde dft

49
推荐指数
1
解决办法
898
查看次数

FFTW与Matlab FFT

我在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)

c++ matlab mex fftw

36
推荐指数
2
解决办法
1万
查看次数

在Python中提高FFT性能

Python中最快的FFT实现是什么?

似乎numpy.fft和scipy.fftpack都基于fftpack,而不是FFTW.fftpack和FFTW一样快吗?如何使用多线程FFT或使用分布式(MPI)FFT?

python numpy fft scipy fftw

26
推荐指数
2
解决办法
2万
查看次数

如何使用C中的FFTW从PortAudio的样本中提取频率信息

我想制作一个程序,用PortAudio录制音频数据(我完成了这部分),然后显示录制音频的频率信息(现在,我想显示每组样本的平均频率)因为他们进来了).

从我做过的一些研究中,我知道我需要进行FFT.所以我用谷歌搜索了一个库,用C语言,找到了FFTW.

但是,现在我有点失落了.我应该怎么处理我记录的样本以从中提取一些频率信息?我应该使用什么样的FFT(我假设我需要一个真实的数据1D?)?

一旦我进行了FFT,如何从它给出的数据中获取频率信息?

编辑:我现在也发现了自相关算法.好点吗?更简单?

非常感谢,对不起,如果这样,我绝对没有经验.我希望它至少有点意义.

c audio fft portaudio fftw

15
推荐指数
1
解决办法
9025
查看次数

问题是将STL复杂<double>转换为fftw_complex

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)

我究竟做错了什么?

c++ complex-numbers fftw reinterpret-cast

14
推荐指数
3
解决办法
9136
查看次数

Java中最近的FFTW包装器

我正在为最新版本的FFTW寻找一个最小的Java包装器.在FFTW网站上列出的包装器要么过时(jfftw-1.2.zip),要么包含太多额外的东西(Shared Scientific Toolbox).谷歌搜索建议JFFTW3看起来很有前景,但下载链接已经破了(有人有镜子吗?)

对于那些想要纯Java FFT库的人来说,JTransforms看起来非常好.我更喜欢使用FFTW,因为它大约快两倍,它处理任意尺寸d> 3.

java scala fft wrapper fftw

13
推荐指数
1
解决办法
3899
查看次数

如何使用傅里叶变换从WAV文件中提取半精确频率

我们说我有一个WAV文件.在此文件中,是精确1秒间隔的一系列正弦音.我想使用FFTW库按顺序提取这些音调.这特别难吗?我该怎么做?

另外,将这种音调写入WAV文件的最佳方法是什么?我假设我只需要一个简单的音频库来输出.

我选择的语言是C.

c audio signal-processing wav fftw

12
推荐指数
2
解决办法
8847
查看次数

为什么我不能用LD_LIBRARY_PATH覆盖动态库的搜索路径?

编辑:我解决了这个问题,解决方案如下.

我正在专用于科学计算的共享计算集群中构建代码,因此我只能控制主文件夹中的文件.虽然我使用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.现在我们在排除列表中添加了该路径.

linux dynamic-linking ld fftw

11
推荐指数
2
解决办法
1万
查看次数

如何在转置的数据数组上使用fftw_plan_many_dft?

我有一个以列主要(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 fftw

10
推荐指数
1
解决办法
4725
查看次数

WAV文件分析C(libsndfile,fftw3)

我正在尝试开发一个简单的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)

c fft wav libsndfile fftw

10
推荐指数
1
解决办法
7970
查看次数