gpt4 book ai didi

python - 使用 Python 进行傅里叶变换

转载 作者:行者123 更新时间:2023-12-04 17:42:29 24 4
gpt4 key购买 nike

我正在尝试使用 Python 进行傅立叶变换。

有一个不错的库 numpy,它具有函数 fft,根据文档假设可以获取一系列点并返回它们的傅立叶变换。

现在我试着让它工作 - 但它看起来不对......

我创建了简单的正弦波 1HzAmplitude=1。我用 8Hz 对其进行采样(所以 8 个采样)

这些是示例:

[0,0.707,1,0.707,0,-0.707,-1,-0.707]

现在我希望得到 ens 的返回。 [0,4,0,0,0,0,0,4][0,8,0,0]表示频率为 1Hz(取决于它是否根据 Nyquist 限制进行了所需的微调)。

但实际上我得到以下信息:

[0.00000000e+00+0.00000000e+00j, -2.22044605e-16-3.99969798e+00j,
0.00000000e+00+0.00000000e+00j, -2.22044605e-16+3.02022804e-04j,
0.00000000e+00+0.00000000e+00j, 2.22044605e-16-3.02022804e-04j,
0.00000000e+00+0.00000000e+00j, 2.22044605e-16+3.99969798e+00j]

这是我的代码:

import numpy
signal = numpy.array([0,0.707,1,0.707,0,-0.707,-1,-0.707], dtype=float)
f = numpy.fft.fft(signal)
print (f)

为什么我会得到这个结果?我做错了什么?

最佳答案

傅立叶变换的输出

nummpy.fft.fft(以及所有其他傅里叶变换方法)的输出具有复数值。此输出编码有关输入中每个频率分量的幅度和相移的信息。您在输出中得到的复数是正确的。

如何从fft.fft的输出中获取频谱

从您的示例来看,您似乎试图获得的输出实际上是频谱(从技术上讲,是 energy spectral density )。您可以通过取 numpy.fft.fft 返回结果的绝对值来计算:

import numpy
signal = numpy.array([0,0.707,1,0.707,0,-0.707,-1,-0.707], dtype=float)
f = numpy.fft.fft(signal)
print(np.abs(f))

输出:

[0.00000000e+00 3.99969798e+00 0.00000000e+00 3.02022804e-04
0.00000000e+00 3.02022804e-04 0.00000000e+00 3.99969798e+00]

这正是您所期望的,只是有些数字不准确。

根据 Warren Weckesser 的评论,您可以使用 2**.5/2 的“真实”值代替您的速记 .707s:

signal = numpy.array([0, 2**.5/2, 1, 2**.5/2, 0, -2**.5/2, -1, -2**.5/2])
f = numpy.fft.fft(signal)
print(np.abs(f))

输出:

[0.00000000e+00 4.00000000e+00 0.00000000e+00 2.22044605e-16
0.00000000e+00 2.22044605e-16 0.00000000e+00 4.00000000e+00]

复数的绝对值就是它的大小。根据 Fourier transform wiki :

the magnitude of the Fourier transform at a point is how much frequency content there is

关于python - 使用 Python 进行傅里叶变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53850063/

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