首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用scipy.fftpack作图时常出现等值线。

用scipy.fftpack作图时常出现等值线。
EN

Stack Overflow用户
提问于 2018-04-02 14:08:04
回答 2查看 2.2K关注 0票数 5

当我在一个信号上用scipy.fftpack计算快速傅里叶变换时,我得到一条恒定的水平线(以及我的数据上的一条垂直线),谁能解释为什么会发生这些线,并且可能会给出一种不需要这些线来绘制光谱的解决方案?

让我们来看看一个简单的信号。频率为12赫兹的正弦波。在本例中,您可以看到关于y = 2.1的水平线。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# test signal
omega = 2 * np.pi * 12
t = np.linspace(-15, 15, 1000)
ampl = np.sin(omega * t)

# compute fft, fft frequences
fft  = abs(scipy.fft(amp))
freq = scipy.fftpack.fftfreq(fft.size, t[1] - t[0])

# plot
plt.plot(freq, fft)

这是我的实验信号的fft图(放大)。您可以看到水平线(y =~ 0.0015)和垂直线(在x = 0处)。

根据这些行,我无法在数组中找到任何数据。为什么会出现这些线条?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-15 01:31:09

您是对的,这一行连接第一个和最后一个数据。正如@侦察眼之前所解释的那样,标准的fft函数倾向于先绘制正频率,然后再绘制负频率。

通过添加第三行和第四行可以很容易地解决这个问题,如下所示

代码语言:javascript
复制
fftData = np.fft.fft(data)
freq = np.fft.fftfreq(lenData, 1/fSamp)
fftData = np.fft.fftshift(fftData)
freq = np.fft.fftshift(freq)
票数 4
EN

Stack Overflow用户

发布于 2018-04-02 14:43:20

FFT中的数据首先包括正频率,然后是负频率。你看到的这条线是把正频率的最后一点和负频率的第一点连接起来的线。

为了避免这种情况,您可以交换光谱的两个半部分,以便数据按自然顺序进行:

代码语言:javascript
复制
plt.plot(scipy.fftpack.fftshift(freq), scipy.fftpack.fftshift(fft))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49612848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档