3

これら 2 つの派手なフーリエ変換の違いを理解しようとしています。

import numpy as np

samples = 256

# define the domain in slightly different ways
t_1 = np.linspace( 0.0, 1.0, samples )
t_2 = np.arange( 0.0, 1.0, 1.0/samples )

## The two domains are not identical, but they're close
print np.sum( (t_1 - t_2) ** 2 )
# 0.0013046364379084878

# simple sin wave
f = lambda t : 2 * np.sin( 2 * 2 * pi * t )

# signals over each domain
s_1 = f( t_1 )
s_2 = f( t_2 )

# fourier transform
fft_1 = np.fft.fft( s_1 )
fft_2 = np.fft.fft( s_2 )

freq = np.fft.fftfreq( samples )

# plot the FFT differences
plt.figure()
plt.subplot( 2,1,1 )
plt.plot( freq, fft_1, 'x' )
plt.subplot( 2,1,2 )
plt.plot( freq, fft_2, 'x' )

fft_plot

信号の単一周波数が明確に検出される場合もあれば、検出されない場合もあります。ある手順は他の手順よりも正しいですか?

4

1 に答える 1

3

2 つのプロットは、思っているよりも似ています。fft は複雑な配列を返すことに注意してください。また、入力関数のシフトは、「k空間」での位相シフトをもたらします。s_2 は k 空間の虚数成分にすべての力を持っているため2*sin(a*pi*x) == i*(exp(i*a*pi*x) - exp(-i*a*pi*x))(y 軸は 1e-12 のオーダーであることに注意してください)、s_1 はわずかにシフトされているため、k の実数成分にわずかな信号が見られます。空間ですが、電力の大部分は依然として虚数成分にあります。実際の成分だけをプロットするのではなく、大きさ abs(k-space) をプロットするとどうなるかを確認してください (これは、複素数が与えられたときに matplotlib が行うようです)。

import numpy as np

samples = 256

# define the domain in slightly different ways
t_1 = np.linspace( 0.0, 1.0, samples )
t_2 = np.arange( 0.0, 1.0, 1.0/samples )

## The two domains are not identical, but they're close
print np.sum( (t_1 - t_2) ** 2 )
# 0.0013046364379084878

# simple sin wave
f = lambda t : 2 * np.sin( 2 * 2 * pi * t )

# signals over each domain
s_1 = f( t_1 )
s_2 = f( t_2 )

# fourier transform
fft_1 = np.fft.fft( s_1 )
fft_2 = np.fft.fft( s_2 )

freq = np.fft.fftfreq( samples )

# plot the FFT differences
plt.figure()
plt.subplot( 2,1,1 )
plt.plot( freq, np.abs(fft_1.imag), 'x' )
plt.subplot( 2,1,2 )
plt.plot( freq, np.abs(fft_2.imag), 'x' )

abs(fft(f))のPLot

于 2012-12-11T20:01:28.583 に答える