【发布时间】:2014-03-02 00:01:23
【问题描述】:
如果这个问题非常基本,我深表歉意。
我正在使用 FFT 将音频信号(目前是纯正弦波)从时域转换到频域,然后返回时域以比较与原始信号的差异。
目前我这样做:
- 采用不重叠的帧(例如每帧 1024 个样本)。
- FFT 该帧
- iFFT 频域信息
- 将输出发送到扬声器
编辑(1):
这似乎现在可以工作(参见没有和有窗口的图像,其中输入=棕色,输出=蓝色)。
结束编辑 (1)
现在我想执行overlapp-add方法:
- 拍摄重叠率为 50% 的帧(样本 0-1023、512-1535、1024-2047...)
- 将汉宁窗应用于 ecah 框架
- FFT
- iFFT
- ???这是我的问题!!
所以在我的 iFFT 结束时,我有一个 1024 个样本的输出帧。这是否意味着我需要将前 512 个样本发送到扬声器,而其他 512 个样本(512-1023)应该保存在缓冲区中,以便添加到下一帧的前 512 个样本中?就这么简单还是我误会了什么?
谢谢!
【问题讨论】:
-
为什么你会期望输出是原始正弦波的低质量副本(除了你没有加窗的事实)?
-
@jaket 我附上了一张图片。输入听起来是连续的,而输出听起来像短脉冲。据我所知,由于频谱泄漏,输出不同,输入频率与任何 FFT 频率箱都不完全匹配。
-
您的代码中有错误。未修改的复数 FFT 结果的 IFFT 应返回准确的原始数据(减去微小的数字舍入问题)。所以在某个地方你正在破坏你的数据。例如:丢弃相位信息会极大地扭曲您的结果。
-
至于最后一个问题:是的,将后半部分保留在缓冲区中,并添加到下一帧的前半部分。可以肯定的是,检查连续帧的窗口函数在重叠区域中加到 1。
-
@hotpaw2 你对这个错误的看法是对的,正如你所看到的,我更正了它。欢迎发表您的建议作为答案,这样我至少可以投票。
标签: signal-processing fft ifft vdsp