私は現在、フーリエ変換をまだ明示的に教えていないが、現在、コースワークのスペクトル分析を行っている。私はscipyでさまざまなfftアルゴリズムを使って遊んでいましたが、答えがどういうものなのか分かっているデータではnumydですなぜscipyとnumpy fftプロットが異なって見えるのですか?
この場合、AM信号は8kHzのキャリア周波数と1kHzの変調正弦波です。 scipy.fftpack.rfft
とnumpy.fft.rfft
を適用する場合、FFT
に3つの明瞭なピークを持っている私は、それぞれ以下のプロットを得る:
scipyのダウンロード:
numpyの:scipy
一方がわずかに小さい最大を有する一方numpy
一つは、より滑らかに見える
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)
異なるストレージ実装によって異なる形のプロットが発生するのはどうですか?あなたの例のように、正確に同じデータが数値形式で格納されていますが、別の形式で保存されていますか? – falcoso
配列の連続した要素に複素数値を格納することは、配列 'magnitude'上の' np.absolute'の演算が 'np.fft.rfft'の場合には複素数値のノルムを与えます'scipy.fftpack.rfft'の場合は、まず数値の実数部の絶対値を与え、次に複素数成分の絶対値を与え、これら2つの演算の結果は異なります。 –