Fourier变换在Python中仅在取绝对值时起作用的原因是什么?

huangapple go评论73阅读模式
英文:

why is the fourier transform in python only working while taking the absolute value?

问题

我遇到了Python中的一个非常奇怪的问题。我想要绘制正弦信号的傅里叶变换,所以我尝试了以下代码:

import numpy as np
import matplotlib.pyplot as plt

#--------------------- 测试 -----------------------------------
# x轴
x02 = np.arange(0, 1, 0.001) # 起始值,结束值,步长
y02 = np.sin(50.0 * 2.0 * np.pi * x02)

# 在时域中绘制正弦波
plt.figure()
plt.plot(x02, y02, color='b')
plt.grid()
plt.title('时域中的正弦波')
plt.show()

# 傅里叶变换
yf02 = np.fft.fft(y02)
xf02 = np.fft.fftfreq(len(y02), 0.001)

# 绘制傅里叶变换
plt.figure()
plt.plot(xf02, yf02, color='b')
plt.grid()
plt.title('频域中的正弦波')
plt.show()

这段代码的结果如下图所示:

Fourier变换在Python中仅在取绝对值时起作用的原因是什么?

现在,如果我使用以下代码绘制我的傅里叶变换的绝对值:

import numpy as np
import matplotlib.pyplot as plt
#--------------------- 测试 -----------------------------------
# x轴
x02 = np.arange(0, 1, 0.001) # 起始值,结束值,步长
y02 = np.sin(50.0 * 2.0 * np.pi * x02)

# 在时域中绘制正弦波
plt.figure()
plt.plot(x02, y02, color='b')
plt.grid()
plt.title('时域中的正弦波')
plt.show()

# 傅里叶变换
yf02 = np.fft.fft(y02)
xf02 = np.fft.fftfreq(len(y02), 0.001)

# 绘制傅里叶变换的绝对值
plt.figure()
plt.plot(xf02, abs(yf02), color='b')
plt.grid()
plt.title('频域中的正弦波')
plt.show()

这段代码可以正常工作:

Fourier变换在Python中仅在取绝对值时起作用的原因是什么?

有人能解释为什么吗?我非常困惑,尽管阅读了所有的教程,但仍不理解np.fft.fft是如何工作的。

英文:

I encourted a very strange thing in python again. I wanted to plot the Fourier Transform of a sinus signal; so I tried the following code:

import numpy as np
import matplotlib.pyplot as plt

#--------------------- test -----------------------------------
#x axis
x02 = np.arange(0, 1, 0.001) # start, stop, step
y02 = np.sin(50.0 * 2.0 * np.pi * x02)

#plot sin in time domain
plt.figure()
plt.plot(x02, y02, color ='b')
plt.grid()
plt.title('Sinus in time domain')
plt.show()

# Fourier transform
yf02 = np.fft.fft(y02)
xf02 = np.fft.fftfreq(len(y02), 0.001)

# plot the Fourier transform
plt.figure()
plt.plot(xf02, yf02, color ='b')
plt.grid()
plt.title('Sinus in frequency domain')
plt.show()

which gives:

Fourier变换在Python中仅在取绝对值时起作用的原因是什么?

now if I plot the absolute values of my Fourier transform with the following code:

import numpy as np
import matplotlib.pyplot as plt
#--------------------- test -----------------------------------
#x axis
x02 = np.arange(0, 1, 0.001) # start, stop, step
y02 = np.sin(50.0 * 2.0 * np.pi * x02)

#plot sin in time domain
plt.figure()
plt.plot(x02, y02, color ='b')
plt.grid()
plt.title('Sinus in time domain')
plt.show()

# Fourier transform
yf02 = np.fft.fft(y02)
xf02 = np.fft.fftfreq(len(y02), 0.001)

# plot the Fourier transform
plt.figure()
plt.plot(xf02, abs(yf02), color ='b')
plt.grid()
plt.title('Sinus in frequency domain')
plt.show()

it works:

Fourier变换在Python中仅在取绝对值时起作用的原因是什么?

Could someone explain me why ? I'm very confused and don't understand how np.fft.fft works despite reading every tutorial.

答案1

得分: 2

如果您想要离散傅里叶变换的幅度,您需要取绝对值 - 这不仅是Numpy的实现。我建议您阅读您正在使用的算法的理论!

英文:

If you want the amplitude of a discrete fourier transform, you need to take the absolute value - this isn't just Numpy's implementation. I would suggest reading up on the theory of the algorithm you're using!

答案2

得分: 2

傅立叶变换是一个复数值函数。
当你绘制fft的复数输出时,matplotlib实际上只会绘制实部。所以你看到的是奇函数的傅立叶变换的实部,这是零(除了舍入误差,注意垂直轴上的1e-12)。

你可以选择绘制虚部,或者绘制幅度。

英文:

The Fourier transform is a complex-valued function.
When you plot the complex output of fft, matplotlib will actually plot the real component only. So what you’re looking at there is the real component of the FFT of an odd function, which is zero (up to rounding errors, note the 1e-12 in the vertical axis).

You could instead plot the imaginary component, or you could plot the magnitude.

huangapple
  • 本文由 发表于 2023年7月20日 22:03:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/76730710.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定