2016-07-22 44 views
2

5Hzでサンプリングされた1Hzの方形波信号であるため、FFT(第2の)プロットでは、周波数= 1.0の大きなピークが他の周波数と比較して高いです。FFTを使用して矩形波の周波数を見つける方法

import numpy as np 
from matplotlib import pyplot as plt 
from scipy import signal 
t500 = np.linspace(0,5,500,endpoint=False) 
s1t500 = signal.square(2*np.pi*1.0*t500) 

最初のプロットは1 Hzの矩形波が5秒間は5Hzでサンプリングを示しています:

t5 = np.linspace(0,5,25,endpoint=False) 
t5 = t5 + 1e-14 
s1t5 = signal.square(2.0*np.pi*1.0*t5) 
plt.ylim(-2,2); plt.plot(t500,s1t500,'k',t5,s1t5,'b',t5,s1t5,'bo'); plt.show() 

私はおそらくここに愚かな何かが欠け、この時に初心者です ここでは、私がやっていることです

1 Hz Square Wave sampled at 5Hz

ここでは2番目のプロットでは、私はMAGNを期待していますf = 1Hzでf = 2よりも大きくなるようにする。何か不足していますか?あなたが複雑な空間でフーリエ変換(DFT/FFTの場合、または数字のシーケンス)機能を作り出す変換するという事実を見逃しているようだ

y1t5 = np.fft.fft(s1t5) 
ff1t5 = np.fft.fftfreq(25,d=0.2) 
plt.plot(ff1t5,y1t5); plt.show() 

FFT for 1 Hz Square Wave sampled at 5Hz

+0

これはDFTのプロパティのようですが、私は同様の例をmatlabのドキュメントで見つけました:http://de.mathworks.com/help/matlab/math/discrete-fourier-transform-dft.html – jojonas

答えて

4

>>> np.fft.fft(s1t5) 
[ 5. +0.j   0. +0.j   0. +0.j   0. +0.j   0. +0.j 
    5.-15.38841769j 0. +0.j   0. +0.j   0. +0.j   0. +0.j 
    5. +3.63271264j 0. +0.j   0. +0.j   0. +0.j   0. +0.j 
# and so on 

見るためにあなたのプロットの振幅スペクトルは、abs

>>> np.absolute(np.fft.fft(s1t5)) 
[ 5.   0.   0.   0.   0.   16.18033989 
    0.   0.   0.   0.   6.18033989 0.   0. 
    0.   0.   6.18033989 0.   0.   0.   0. 
    16.18033989 0.   0.   0.   0.  ] 
01251641を適用する

それ以外の場合は実数部分のみが表示されます。

+0

私は 'np.fft.rfft'を使って、期待される1/n依存関係を返さないのでしょうか? – jojonas

+0

対称矩形波を使用している場合、FFTはすべて実数(機械精度)になります。Matlabの例を以下に示します。http://blogs.mathworks.com/steve/2010/07/16/ complex-surprises-from-fft/ –

+0

@AhmedFasih OPは実際の1Hz方形波ではなく、5Hzサンプリングレートで作られたサンプルのセットを変換します。これにより、虚数部が導入されます。 – Vovanrock2002

関連する問題