FFT和IFFT的长度

时间:2015-04-30 11:40:52

标签: c++ matlab fft fftw frequency-analysis

我有一些信号,我分别混合到一个更大的信号,每个信号位于不同的频率区域。 现在,我使用FFTW对大信号执行FFT运算,并切断具体的FFT分档(信号所在的位置)。

E.g。大信号用1024点FFT进行FFT变换 信号的采样率为fs = 200000

我按以下方式计算给定起始停止频率的混凝土箱位置:

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

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

但是当我在MATLAB中将提取的信号与原始的小信号进行比较时,我可以看到原始信号(是一个wav-File)有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中分析数据(目前在工作中)

2 个答案:

答案 0 :(得分:2)

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

  1. 在感兴趣的频率仓之前和之后用零填充缓冲区
  2. 在该缓冲区中的相同位置复制感兴趣的频率仓
  3. 如果使用全谱表示(如果使用fftw_plan_dft_1d(..., FFTW_BACKWARD,...进行逆变换),则计算谱的上半部分的Hermitian对称性(或者简单地使用半谱表示并执行逆通过fftw_plan_dft_c2r_1d转换。
  4. 也就是说,通过使用专门设计的滤波器而不是仅使用频域中的矩形窗口,您将获得更好的频率分解。

答案 1 :(得分:1)

FT的输出长度等于输入长度。我不知道你怎么到16箱; 1024输入的FT是1024个箱。现在对于一个真正的输入(不复杂),1024个区域将在512/513左右镜像相同,因此您的FFT库可能仅返回实际输入的低512个区间。不过,那还不到16个箱子。

在进行IFFT时,您可能需要填充所有1024个分档,因为它通常不会假设其输出将成为真实信号。但那只是反映了较低512个分档的问题。