使用python的FFT系数

Posted

技术标签:

【中文标题】使用python的FFT系数【英文标题】:FFT coefficients using python 【发布时间】:2015-06-15 01:55:11 【问题描述】:

我是信号处理方面的新手。在这里,我想问一下如何从 python 中的 FFT 中获取 FFT 系数。这是我的代码示例:

from scipy.fftpack import fft
# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
import matplotlib.pyplot as plt
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()

【问题讨论】:

【参考方案1】:

嗯,我也不太了解信号处理,但也许这可行:

from scipy.signal import argrelmax
f = xf[scipy.signal.argrelmax(yf[0:N/2])]
Af = np.abs(yf[argrelmax(yf[0:N/2])])

【讨论】:

【参考方案2】:

在this 中引用@hotpaw 类似的答案:

"实部和虚部放在一起可以表示一个复数数组。复数数组在频域中的每一个复数元素都可以认为是一个频率系数,其大小为sqrt(RR +我我))”。

因此,系数是 fft 函数返回的数组中的复数元素。此外,使用 FFT 函数的 bin 大小(数量)也很重要。测试一堆值并选择对您的应用程序更有意义的值是有意义的。通常,它与样本数量的数量级相同。这是大多数给出的答案所假设的,并产生了很好且合理的结果。如果有人想探索,这是我的代码版本:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

fig = plt.figure(figsize=[14,4])
N = 600           # Number of samplepoints
Fs = 800.0
T = 1.0 / Fs      # N_samps*T (#samples x sample period) is the sample spacing.
N_fft = 80        # Number of bins (chooses granularity)
x = np.linspace(0, N*T, N)     # the interval
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)   # the signal

# removing the mean of the signal
mean_removed = np.ones_like(y)*np.mean(y)
y = y - mean_removed

# Compute the fft.
yf = scipy.fftpack.fft(y,n=N_fft)
xf = np.arange(0,Fs,Fs/N_fft)

##### Plot the fft #####
ax = plt.subplot(121)
pt, = ax.plot(xf,np.abs(yf), lw=2.0, c='b')
p = plt.Rectangle((Fs/2, 0), Fs/2, ax.get_ylim()[1], facecolor="grey", fill=True, alpha=0.75, hatch="/", zorder=3)
ax.add_patch(p)
ax.set_xlim((ax.get_xlim()[0],Fs))
ax.set_title('FFT', fontsize= 16, fontweight="bold")
ax.set_ylabel('FFT magnitude (power)')
ax.set_xlabel('Frequency (Hz)')
plt.legend((p,), ('mirrowed',))
ax.grid()

##### Close up on the graph of fft#######
# This is the same histogram above, but truncated at the max frequence + an offset. 
offset = 1    # just to help the visualization. Nothing important.
ax2 = fig.add_subplot(122)
ax2.plot(xf,np.abs(yf), lw=2.0, c='b')
ax2.set_xticks(xf)
ax2.set_xlim(-1,int(Fs/6)+offset)
ax2.set_title('FFT close-up', fontsize= 16, fontweight="bold")
ax2.set_ylabel('FFT magnitude (power) - log')
ax2.set_xlabel('Frequency (Hz)')
ax2.hold(True)
ax2.grid()

plt.yscale('log')

输出:

【讨论】:

以上是关于使用python的FFT系数的主要内容,如果未能解决你的问题,请参考以下文章

FFT 的返回值(系数)的单位是啥?

如何识别 FFT 数据的局部最大值

提高 Python 中的 FFT 性能

任意模数NTT(拆系数FFT)

任意模数NTT(拆系数FFT)

FFT与图像最大互相关算法