gpt4 book ai didi

c++ - FFT和IFFT的长度

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:40 25 4
gpt4 key购买 nike

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

例如:大信号用1024点进行FFT变换,信号的采样率为 fs=200000

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

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

例如我得到的第一个信号被切掉了 16 个 bin。现在,我再次使用 FFTW 进行 IFFT 变换并取回 16 个复数值(因为我为 16 个 bin 保留了 vector )。

但是当我在 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中分析数据(目前正在工作中)。

最佳答案

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

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

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

关于c++ - FFT和IFFT的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29966786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com