2015-06-15 3 views
0

Я новичок в обработке сигналов. Здесь я хочу спросить, как получить коэффициенты FFT из FFT из python. Это пример моего кода:Коэффициенты FFT с использованием python

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() 

enter image description here

ответ

0

Хм, я не знаю об обработке сигналов либо, но, возможно, это работает:

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

Цитирование @hotpaw, в this аналогичной ответ:

«Реальные и мнимые массивы при объединении могут представлять сложный массив. Каждый комплекс элемент комплексного массива в частотной области можно рассматривать как частотный коэффициент, и имеет величину SQRT (R R + I I))».

Таким образом, коэффициенты являются комплексными элементами массив, возвращаемый функцией fft. Кроме того, важно играть с размером (числом) бункеров для функции FFT. Было бы разумно протестировать кучу значений и выбрать тот, который имеет больше смысла для вашего часто бывает так же, как и большинство ответов, и дает большие и разумные результаты. В случае, если кто-то хочет изучить это, вот моя версия кода:

%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') 

Выход: enter image description here

Смежные вопросы