2015-04-30 135 views
3

我有一些信号和我混合分别加起来一个更大的信号,其中每个信号位于不同的频率区域。 现在,我使用FFTW对大信号执行FFT操作,并将具体的FFT分档(信号所在的位置)切出。FFT和IFFT的长度

E.g.大信号FFT变换与1024点 的信号的采样速率为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数据(是在工作的那一刻)

+0

请问您可以发布您的代码吗?这会使你的描述更加清晰,也可能代码没有正确地遵循你的描述。 – buzjwa

+1

什么wav文件你有200000的采样率?疯。 – dmedine

+2

IFFT输入的长度与您想要输出的长度(例如1024,与放入第一个FFT的数据的长度相同)不会更短(例如16而不是1024)。如果你想要真正的结果,IFFT的输入也必须是共轭对称的。 – hotpaw2

回答

2

如果您有一个由1024个样本组成的实际信号,则可以通过将频谱乘以矩形窗口,然后采用IFFT来获得来自所关注的16个频率仓的贡献。这基本上相当于:

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

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

+0

我的理解正确: 创建一个零初始化的复数缓冲区(我使用的信号很复杂)与全尺寸的FFT长度相同,然后将混凝土箱复制到原始缓冲区中的位置。 对于窗口我可以根据用户请求DPSS或Kaiser使用多相滤波器组技术(https://casper.berkeley.edu/wiki/The_Polyphase_Filter_Bank_Technique) –

+0

如果您已经隔离感兴趣的频率内容(通过显着减少其他频率点),那么就没有必要去掉那些垃圾箱了。具有正确参数的多相滤波器组可以为您做到这一点。 – SleuthEye

1

的FT的输出长度等于输入长度。我不知道你是如何得到16箱; 1024个输入的FT是1024个分档。现在对于一个真正的输入(不是复杂的),1024个分档在512/513左右是相同的,所以你的FFT库可能只返回512个分档,用于实际输入。但是,这超过了16个垃圾箱。

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

+0

这16个箱子是我从全尺寸光谱中切割/提取的混凝土箱子,以获得检测到的信号。但是,感谢提供缓冲区填充fft长度的提示 –