gpt4 book ai didi

Numpy FFT 稳定性

转载 作者:行者123 更新时间:2023-12-01 15:52:17 35 4
gpt4 key购买 nike

我试图理解这两个 numpy 傅立叶变换之间的区别:

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

在一种情况下,可以清楚地检测到信号中的单一频率,而在另一种情况下则不能。一个过程是否比另一个更正确?

最佳答案

这两个情节比您意识到的更相似。请记住,fft 返回一个复数数组。输入函数的偏移也会导致“k 空间”中的相移。因为 2*sin(a*pi*x) == i*(exp(i*a*pi*x) - exp(-i*a*pi*x)),s_2 有所有它在 k 空间的虚部中的功率(注意 y 轴大约为 1e-12),s_1 略微移动,因此您在 k 空间的实部中看到一点信号,但大部分功率仍然在虚部。看看当我绘制幅值 abs(k 空间) 而不是仅绘制实部时会发生什么(这是 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' )

PLot of abs(fft(f))

关于Numpy FFT 稳定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823768/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com