c++ - FFT和IFFT的长度

标签 c++ matlab fft fftw frequency-analysis

我有一些信号,我将它们加起来形成一个更大的信号,其中每个信号都位于不同的频率区域。 现在,我使用 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/

相关文章:

linux - MATLAB 中的最大波特率是多少?

c++ - 如何检测测量水位的白色仪表板?

matlab - 如何使用 Matlab 高效计算矩阵项

c - 1D IDCT 的实现是如何工作的?

python - Python 和 Matlab 中平均频率的差异

python - 如何从 pandas 数据帧制作 PSD 图?

c++ - 从基础对象(智能)指针复制派生对象

c++ - 错误 : AddressSanitizer: heap-buffer-overflow on address X at pc Y bp Z sp W

c++ - 从 PostgreSQL DB 和 Linux 转移 C/C 中的时间戳?

c++ - c++中的包含编译模型