我正在尝试实现FFT,我可以使用代码等,但事情的一般顺序让我感到困惑。
我是否正确地认为这是正确的事情顺序?
输入 - >重叠输入 - >窗口 - > FFT - >相位计算/重叠补偿 - >输出
我的结果关闭到我的输入频率,但是它们一直是因为我无法解决的一些因素,即440Hz总是407Hz,430Hz始终是420Hz。
令我困惑的主要部分是初始重叠,因为我一直在研究一些开源的FFT代码,这是我永远无法解决的部分。我似乎从看到那些在窗口之前应该发生重叠的想法得到了这个想法,但对我来说逻辑上,不会对窗口造成混乱吗?
任何建议都会很棒
由于
答案 0 :(得分:7)
FFT是连续傅里叶变换的离散版本。
FFT生成一个复数的1D向量。这个复杂的矢量通常用于计算频率幅度与频率的二维矩阵,并表示为二维图形,如下所示:
当您想要了解信号的频谱时,使用单个FFT。例如,根据上面的FFT图,我们可以说这位女高音的G5音符中的大部分能量都集中在784 Hz和1572 Hz的频率上。
STFT或"短时傅里叶变换"使用滑动帧FFT产生频率与时间的二维矩阵,通常表示为一个称为频谱图的图形,如下所示:
当您想知道信号中特定频率事件发生的时间时,使用STFT。例如,从上图可以看出,这个声乐短语中的大部分能量发生在0.05到0.15秒之间,频率范围为100 Hz到1500 Hz。
FFT的工作流程为:
对信号进行采样 - >窗口整个样本框架 - > FFT - >计算幅度和相位 - >输出一些东西,通常是2D图形
如果您的时域数据以文本形式提供,并且您可以在此处发布,我们可以尝试帮助您进行分析,或者您可以使用此在线FFT自行分析:Sooeet FFT calculator
答案 1 :(得分:0)
如果您使用窗口进行FFT,您的计算将是一种STFT。 有一些准备好的STFT代码,如'Spectrogram'等。 要通过FFT编写代码,重叠是不可避免的,但您可以使用一些优化方法来最小化重影效果。而且,窗口化的实用方法可能是根据频率扩展选择窗口的带宽。很明显,在高频数据中,您需要选择非常耗时的小窗口。 我在Matlab中不够好用粘合剂编写这段代码:)
祝你好运