2017-02-21 12 views
1

私はPythonのfftが(あるいは一般的に)どのように動作するかを理解しようとしています。
数秒間録音された信号がある場合、そのFFTの1秒間しか表示できません。
すべてのデータを取得し平均化する方法はありますか? これまではLabViewでこれを行っていました。 誰でも助けてくれますか?数秒以上のナンシーFFT

ここに私が使用しているコード例があります。

from numpy import linspace, sin, pi, log10, average, arange 
from matplotlib.pyplot import plot, show, figure 
from numpy.fft import fft, fftfreq 

N = 1000 * 60 * 4 
dt = 1/1000 
x = linspace(0, N*dt, N) 
freq = linspace(10, 200, N) 
sinsweep = sin(x*freq) 
mavg = [average(sinsweep[i*60:(i+1)*60]) for i in range(int(N/60))] 
plot(freq, sinsweep, '.') 
plot(linspace(10, 200, int(N/60)), mavg, '.') 

f = figure() 
t = arange(60) 
sp = fft(mavg, n=60) 
freq = fftfreq(t.shape[-1]) 
plot(sp.imag) 
show() 

plot data fft

+0

私はあなたが何をしようとしているのか分からない。期待される成果は?使用するコードは機能します。それは1秒以内に平均信号を取り、複数秒を表示します。 – Glostas

+0

私はすべての周波数のすべてのテストの継続時間を示すfftグラフを取得しようとしています。私が売っている意味は、10から200 Hzの広い範囲を得る。 –

+1

信号のFFTを取ると完了です – Glostas

答えて

1

私は美しいスペクトルを得るために、あなたのコードにいくつかの修正を与えます。まず、Shannonの基準を確認するためにポイントの数を増やします。そしていくつかのトリックを
にすると速度が向上します。 enter image description here

ため

from numpy import linspace, sin, pi, log10, average, arange 
from matplotlib.pyplot import plot, show, figure 
from numpy.fft import fft, fftfreq 
close() 
N = 10000 * 60 * 4 
dt = 1/10000 
t = arange(0, N*dt, dt) 
freq = linspace(10, 200, N) 
sinsweep = sin(t*freq) 
mavg = sinsweep.reshape(-1,60).mean(1) 
tm=t[::60] 
figure('signal') 
plot(tm, mavg)  
sp = fft(mavg) 
freq = fftfreq(tm.size,dt*60) 
valid=freq>0 
figure('spectrum') 
plot(freq[valid],abs(sp[valid])) 
show() 

それはあなたが期待したものですか?

+0

はい、ありがとうございます。しかし、私はFFTプログラムがどの周波数を使っているのか分かりません。すべてのデータを計算すると、データは1Hzであると見なすことができますか?そして、入力がmと言う場合、Yの単位は何ですか?ありがとうございました。 –

+1

Te(サンプリング)は1/dt、合計時間はt_max-t_minです。 Yは正規化されていません。それを(N/2)で除算して、良い大きさにする必要があります。あなたの「平均」(/ 60)はそのすべてについて話すのを簡単にしません。 –

関連する問題