np.fft.fft()结果的物理意义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了np.fft.fft()结果的物理意义相关的知识,希望对你有一定的参考价值。

参考技术A 采样定理:采样频率大于信号中最高频率的2倍时,采样后的数字信号可以完整地恢复出原始信号。一般实际应用中保证采样频率为信号最高频率的2.56~4倍。

假设信号频率为F,采样频率为Fs,采样点数为N。为了方便进行FFT运算,通常N取2的整数次幂。

N个采样点,经过fft变换后的结果为N个复数,每个复数对应一个频率(第n<=N/2个点对应的频率为 (n-1)/N*Fs ),该复数的模值表示该频率的振幅特征。该振幅特征和原始信号的振幅之间的关系是: 如果原始信号的振幅为A,则fft结果的每个点(除了第一个直流分量点)的模值就是A的N/2倍;而第一个点的模值是直流分量振幅的N倍。
注意:这N个复数点去掉第一个点后剩下的N-1个点是关于其中心共轭对称的,因此实际只需要取前一半点的频谱即可,因为共轭对称的两个点的模值(振幅)相同。

我们先模拟一个一维时序信号 y ,它由2V的直流分量(0Hz),和振幅为3V,频率为50Hz的交流信号,以及振幅为1.5V,频率为75Hz的交流信号组成:
y = 2 + 3*np.cos(2*np.pi*50*t) + 1.5*np.cos(2*np.pi*75*t)
然后我们采用256Hz的采样频率,总共采样256个点。
傅里叶变换结果如下图所示, no normalization 对应的是原始的fft结果, normalization 是将fft结果的振幅特征转换为原始信号的振幅,可以看到振幅为2V,3V,1.5V的信号分别被解析了出来。

2D fft - 空虚部

【中文标题】2D fft - 空虚部【英文标题】:2D fft - Null imaginary part 【发布时间】:2014-08-18 08:50:58 【问题描述】:

我正在将 Python 例程集成到 C++ 代码中。

有一些实矩阵的fft 2D的计算,在Python中使用

F_BLK=np.fft.fft2(blk)

F_BLK 是一个复数 512*24 矩阵,系数与实部和虚部复数,数量级为 10e5。

当我在 C++ 中计算矩阵的 fft2 时,我得到一个具有复系数的复矩阵 其实部的数量级为 10e6,虚部为空

如果 fft2 的虚部为空,这意味着什么? 这些错误结果的可能来源是什么? 您会推荐一个用于计算 fft2 的 C++ 库吗?

【问题讨论】:

我添加了答案,但没有关于您的 FFT 数据和实现的更多信息,这一切都只是有根据的猜测...... 【参考方案1】:

    如果你使用真实输入进行 FFT

    那么您就不需要进行这么多的计算(C += R * C 比 C += C * C 更简单) 因此,如果您对此类输入数据进行了 FFT C = f(R) 编码,那么它通常会更快 然后标准 FFT C= f(C) 而且您不需要为输入虚部分配内存 同样当输入数据为实数时,只有 FFT 输出是对称的 因此您可以只计算输出数据的前半部分并镜像其余部分

    幅度差异

    您的 FFT 实现有误(在 python 或 C++ 中) 或者你只是有不同的归一化系数 绘制数据并比较差异是否只是恒定比例因子 如果不是,那么您在某处的 FFT 实现中存在错误,或者 python FFT 不是 FFT 也不要忘记任何 FFT 的数据大小必须是 2 的幂 如果您的实现期望这样,那么这也可能是错误的原因 所以尝试在 FFT 之前通过零填充将矩阵 512x24 调整为 512x32 另一个可能导致此问题的原因可能是溢出错误 如果您将大数和小数混合在一起,您的准确性就会丢失 尤其是通过 FFT 递归,输出幅度可以是 10e5,但子结果可以大得多!!!

    二维快速傅里叶变换

    看这里2D FFT,DCT by 1D FFT,DCT 它包含慢速一维 DFT、C++ 中的 iDFT 实现 (R-&gt;C,C-&gt;R) 以及如何使用它计算 2D 变换的算法 结果正确,以便您检查自己的结果

【讨论】:

以上是关于np.fft.fft()结果的物理意义的主要内容,如果未能解决你的问题,请参考以下文章

将 FFT 应用于 1024 个样本的每个块

论文3

返回 Numpys FFT 的数据并在音频文件中找到每秒的幅度和频率

卷积计算的物理意义

点积与叉乘的运算与物理意义

叉乘的几何意义