Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
6年前关闭。
Improve this question
我想更好地了解FFTW的API。 FFTW是一个用于在一个或多个维度上计算离散傅里叶变换(DFT)的库。
现在,假设我有一个正弦波形x = 30 * sin(2 * M_PI * f * i * T),其中f是频率(例如f = 1000Hz)。
如果我使用FFTW的功能分析波形,我希望获得一个频率f = 1000Hz。
我的问题是如何使用FFTW库在c++中做到这一点?
任何帮助,将不胜感激。
完成后,您可以使用实值数据样本填充
复数值结果将存储在
请注意,通常
完成后,可以使用以下方法释放分配的资源:
请注意,如果您可以使用这些函数的
更新:如果要与
或者,将输入样本类型更改为
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
6年前关闭。
Improve this question
我想更好地了解FFTW的API。 FFTW是一个用于在一个或多个维度上计算离散傅里叶变换(DFT)的库。
现在,假设我有一个正弦波形x = 30 * sin(2 * M_PI * f * i * T),其中f是频率(例如f = 1000Hz)。
如果我使用FFTW的功能分析波形,我希望获得一个频率f = 1000Hz。
我的问题是如何使用FFTW库在c++中做到这一点?
任何帮助,将不胜感激。
最佳答案
您可以在FFTW's documentation中找到更多详细信息。
但是,对于一维实值信号的相对简单情况,以下是您必须执行的一般步骤的总结。
通常,您将需要分配输入/输出缓冲区,以及FFTW用于自己的簿记的数据结构,该库将其称为plan
。这可以通过多种方式来完成(有关更多详细信息,请参见FFTW的文档),例如:
#include "fftw3.h"
// First choose a buffer size:
// Typically best performance with a power of 2
// but could be a product of small primes
int input_size = 1024;
// Compute corresponding number of complex output samples
int output_size = (input_size/2 + 1);
// Allocate input and output buffers
double* input_buffer = static_cast<double* >(fftw_malloc(input_size * sizeof(double)));
fftw_complex* output_buffer = static_cast<fftw_complex*>(fftw_malloc(output_size * sizeof(fftw_complex)));
// Create plan
// Select plan creation flags
// see http://www.fftw.org/fftw3_doc/Planner-Flags.html#Planner-Flags
int flags = FFTW_ESTIMATE;
fftw_plan plan = fftw_plan_dft_r2c_1d(input_size,
input_buffer,
output_buffer,
flags);
完成后,您可以使用实值数据样本填充
input_buffer
进行分析,并使用以下方法执行FFT: fftw_execute(plan);
复数值结果将存储在
output_buffer
中,其中output_buffer[0]
对应于频率0,而output_buffer[output_size-1]
对应于采样率的一半。该计划可以执行多次(使用input_buffer
中的更新值,导致output_buffer
中的相应更新值)。请注意,通常
fftw_complex
(在此示例中为输出使用的数据类型)实现为2个值的数组:索引0对应于实数部分,索引1对应于虚数部分(例如output_buffer[i][0]
对应于虚数部分)第i个频率分量的实部)。完成后,可以使用以下方法释放分配的资源:
fftw_free(input_buffer);
fftw_free(output_buffer);
fftw_destroy_plan(plan);
请注意,如果您可以使用这些函数的
float
,double
或long double
版本。只需链接到相应的libfftw3f-3.lib
,libfftw3-3.lib
或libfftw3l-3.lib
即可。更新:如果要与
fftw_plan_dft_1d
一起使用复数值输入样本,则必须像下面这样设置实部和虚部:for (i = 0; i < N-1; ++i) {
t[i]=i*T;
signal[i][0] = 0.7 * sin(2*M_PI*f*t[i]); // real-part
signal[i][1] = 0.0; // imaginary-part
}
或者,将输入样本类型更改为
float
,double
或long double
(以及使用fftw_plan_dft_r2c_1d
一起)。关于c++ - 如何用FFTW进行频谱分析? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23879566/
10-08 20:30