FFT 和 IFFT 的长度

Posted

技术标签:

【中文标题】FFT 和 IFFT 的长度【英文标题】:Length of FFT and IFFT 【发布时间】:2015-04-30 11:40:51 【问题描述】:

我有一些信号,我将它们加起来形成一个更大的信号,其中每个信号位于不同的频率区域。 现在,我用 FFTW 对大信号进行 FFT 运算,并切出具体的 FFT bin(信号所在的位置)。

例如:大信号经过1024个点的FFT变换, 信号的采样率为fs=200000

我通过以下方式计算给定开始和停止频率的具体 bin 位置:

tIndex.iStartPos = (int64_t) ((tFreqs.i64fstart) / (mSampleRate / uFFTLen));

例如我得到第一个信号被切掉 16 个箱子。 现在我再次使用 FFTW 进行 IFFT 转换并返回 16 个复数值(因为我为 16 个 bin 保留了向量)。

但是当我将提取的信号与 MATLAB 中的原始小信号进行比较时,我可以看到原始信号(是 wav 文件)具有 xxxxx 数据,而我的信号(我保存为原始二进制文件)只有16 个复数值。

那么如何获取要正确转换的IFFT操作的长度呢?这里有什么问题?

编辑 逻辑本身分为 3 个程序,每行都在多线程环境中。出于这个原因,我在这里发布了一些伪代码:

ReadWavFile(); //returns the signal data and the RIFF/FMT header information
CalculateFFT_using_CUFFTW(); //calculates FFT with user given parameters, like FFT length, polyphase factor, and applies polyphased window to reduce leakage effect
GetFFTData(); //copy/get FFT data from CUDA device
SendDataToSignalDetector(); //detects signals and returns center frequency and bandwith for each sigal
Freq2Index(); // calculates positions with the returned data from the signal detector
CutConcreteBins(position);
AddPaddingZeroToConcreteBins(); // adds zeros till next power of 2
ApplyPolyphaseAndWindow(); //appends the signal itself polyphase-factor times and applies polyphased window
PerformIFFT_using_FFTW();
NormalizeFFTData();
Save2BinaryFile();

-->然后在MATLAB中分析数据(目前正在工作中)。

【问题讨论】:

能否请您发布您的代码?这将使您的描述更清晰,也可能是代码没有正确遵循您的描述。 你有什么wav文件,采样率为200000?疯了。 IFFT 的输入长度必须与您想要输出的长度相同(例如 1024,与您放入第一个 FFT 的数据长度相同),而不是更短(例如16 而不是 1024)。如果您想要真正的结果,IFFT 的输入也必须是共轭对称的。 【参考方案1】:

如果您有一个由 1024 个样本组成的真实信号,则可以通过将频谱乘以一个矩形窗口然后进行 IFFT 来获得 16 个感兴趣频率区间的贡献。这基本上相当于:

    在感兴趣的频率区间前后用零填充缓冲区 在该缓冲区中的相同位置复制感兴趣的频率区间 如果使用全谱表示(如果您使用fftw_plan_dft_1d(..., FFTW_BACKWARD,... 进行逆变换),则计算频谱上半部分的厄米对称性(或者简单地使用半谱表示并通过以下方式执行逆变换fftw_plan_dft_c2r_1d)。

也就是说,通过使用专门设计的滤波器而不是仅在频域中使用矩形窗口,您将获得更好的频率分解。

【讨论】:

我是否理解正确:创建一个具有全尺寸 FFT 长度的零初始化复数缓冲区(我使用的信号是复数),然后将具体箱复制到原始缓冲区中的位置。对于窗口,我已经通过用户请求 DPSS 或 Kaiser 使用了多相滤波器组技术(casper.berkeley.edu/wiki/The_Polyphase_Filter_Bank_Technique) 如果您已经隔离了感兴趣的频率内容(通过显着衰减其他频率分档),则无需删除这些分档。具有正确参数的多相滤波器组可以为您做到这一点。【参考方案2】:

FT 的输出长度等于输入长度。我不知道你是如何达到 16 个垃圾箱的; 1024 个输入的 FT 是 1024 个 bin。现在对于真实输入(不复杂),1024 个 bin 将在 512/513 左右镜像相同,因此您的 FFT 库可能仅返回较低的 512 个 bin 用于真实输入。尽管如此,这还是超过 16 个垃圾箱。

在进行 IFFT 时,您可能需要填充所有 1024 个 bin,因为它通常不会假设其输出会变成真实信号。但这只是镜像较低的 512 个 bin 的问题。

【讨论】:

这 16 个 bin 是具体的 bin,我从全尺寸频谱中剪切/提取,以获得检测到的信号。但感谢您提示用完整的 fft 长度填充缓冲区跨度>

以上是关于FFT 和 IFFT 的长度的主要内容,如果未能解决你的问题,请参考以下文章

傅里叶空间滤波

信号处理之DFTIDFT

在opencv中使用FFT和IFFT有困难

FFT和IFFT的Matlab实现(幅频响应和相频响应)

FFT和IFFT的Matlab实现(幅频响应和相频响应)

我在哪里可以找到真正的 FFT 和 iFFT 实现? [关闭]