2017-11-15 17 views
2

私は現在、フーリエ変換をまだ明示的に教えていないが、現在、コースワークのスペクトル分析を行っている。私はscipyでさまざまなfftアルゴリズムを使って遊んでいましたが、答えがどういうものなのか分かっているデータではnumydですなぜscipyとnumpy fftプロットが異なって見えるのですか?

この場合、AM信号は8kHzのキャリア周波数と1kHzの変調正弦波です。 scipy.fftpack.rfftnumpy.fft.rfftを適用する場合、FFT

に3つの明瞭なピークを持っている私は、それぞれ以下のプロットを得る:

scipyのダウンロード:

enter image description here

numpyの:scipy一方がわずかに小さい最大を有する一方numpy一つは、より滑らかに見える

enter image description here

2つのFFTの形状は、ピーク間の正しい比率とほぼ同じであるが、ピークを持ち、より多くのノイズを持っています。

私はこれが離散フーリエ変換アルゴリズムのさまざまなアプリケーションに大きく依存していると仮定していますが、実行時にscipyの実装がどのように高速化されているかに関する他の記事を見てきました。しかし、私はそれが具体的に違いを引き起こしていること、そして実際にはより正確なものをさまよっていましたか?

EDIT:コードは、プロットを生成するために使用される:

data = pd.read_csv("./Waveforms/AM waveform Sine.csv", sep = ',', dtype = float) 

data = data.as_matrix() 
time = data[:,0] 
voltage = data[:,1]/data[:,1].max() # normalise the values 

#scipy plot: 
plt.figure() 
magnitude = scipy.fftpack.rfft(voltage) 
freq = scipy.fftpack.rfftfreq(len(time),np.diff(time)[0]) 
plt.figure() 
plt.plot(freq, np.absolute(magnitude), lw = 1) 
plt.ylim(0,2500) 
plt.xlim(0,15) 

#numpy plot 
magnitude = np.fft.rfft(voltage) 
freq = np.fft.rfftfreq(len(time),np.diff(time)[0]) 

plt.figure() 
plt.plot(freq, np.absolute(magnitude), lw = 1) 
plt.ylim(0,2500) 
plt.xlim(0,15) 

答えて

6

numpyののdocからrfftのために:

戻り値:

アウト:複雑なndarray

切り捨てまたはゼロ軸に沿って変換された、軸に沿って変換されたパッディングされた入力、または軸によって示された軸の最後にある、軸が指定されていない場合はneです。 nが の場合でも、変換軸の長さは(n/2)+1です。 nが奇数の場合、 の長さは(n + 1)/ 2です。

明示的には書かれていませんが、「変換されたデータ」はここでは複雑です。

scipyのダウンロードのdocからrfftため

Z:リアルndarray

返される本当の配列には含まれています

[y(0),Re(y(1)),Im(y(1)),...,Re(y(n/2))]    if n is even 
[y(0),Re(y(1)),Im(y(1)),...,Re(y(n/2)),Im(y(n/2))] if n is odd 

結論:ストレージが異なっているが。

スターターについては、magnitudeの長さを見てください。どちらの場合も異なります。Iは、明確にするために以下の例を与える:両方の場合において

In [33]: data = np.random.random(size=8) 

In [34]: np.fft.rfft(data) 
Out[34]: 
array([ 3.33822983+0.j  , 0.15879369+0.48542266j, 
     0.00614876+0.03590621j, -0.67376592-0.69793372j, 1.51730861+0.j  ]) 

In [35]: scipy.fftpack.rfft(data) 
Out[35]: 
array([ 3.33822983, 0.15879369, 0.48542266, 0.00614876, 0.03590621, 
     -0.67376592, -0.69793372, 1.51730861]) 

最初の要素は、いわゆる「DC成分」(信号の平均値)です。

次に、SciPyバージョンでは、NumPyバージョンの実数部と虚数部の連続を認識できます。

+0

異なるストレージ実装によって異なる形のプロットが発生するのはどうですか?あなたの例のように、正確に同じデータが数値形式で格納されていますが、別の形式で保存されていますか? – falcoso

+0

配列の連続した要素に複素数値を格納することは、配列 'magnitude'上の' np.absolute'の演算が 'np.fft.rfft'の場合には複素数値のノルムを与えます'scipy.fftpack.rfft'の場合は、まず数値の実数部の絶対値を与え、次に複素数成分の絶対値を与え、これら2つの演算の結果は異なります。 –

関連する問題