【问题标题】:Fast Fourier Transform for Harmonic Analysis用于谐波分析的快速傅里叶变换
【发布时间】:2015-02-10 22:52:45
【问题描述】:

我正在分析波动中存在的谐波,作为弹拨发生位置的函数。我希望得到一个类似本页展示的情节:https://softwaredevelopmentperestroika.wordpress.com/2013/12/10/fast-fourier-transforms-with-python-the-noise-and-the-signal/。为此,我编写了对非对称三角形进行建模的代码并实现了 numpy 的 fft。然而,输出的数据不是我所期望的,它的峰值约为 0 Hz。这是我的代码及其输出:

from numpy.fft import fft as npfft, fftfreq as npfftfreq
#triangular pulse
def triangular_pulse(x, xmean, sigma):
    for i in x:
        if x[i]<=xmean:
            y[i] = x[i]*(sigma/xmean)
        else :
            y[i] = sigma-(x[i]-xmean)*(sigma/(200-xmean))
    return y

N_masses = 200
T  = 0.0669264714
mu = .03937
cSq = T/mu
c  = np.sqrt(cSq)
dx = 1.0

dt = dx/c
print dt

#Initialize some arrays
x0  = np.arange(N_masses)*dx
y   = np.zeros(N_masses)
vy  = np.zeros(N_masses)
ay  = np.zeros(N_masses)

#Set Initial conditions (pluck)
# # half-pluck
# y = 30*gaussian_pulse(x0,x0[N_masses/2],2)

# quarter-pluck
y = triangular_pulse(x0,x0[N_masses/4],1)

rhat=npfft(y)
freaq=npfftfreq(len(y),dt)
plt.plot(freaq,np.abs(rhat)/len(rhat))
plt.show()

如果您发现我的问题的根源,请告诉我。谢谢!

更新

已添加 y = triangular_pulse(x0,x0[N_masses/40],1) y-=np.mean(y) 结果是更宽的非零频带;然而,峰值仍然以“0”为中心。

【问题讨论】:

  • 根据建议的更改,峰值不以 0 为中心。在 0 处,fft 的绝对值为 0。在非常低的频率处有 2 个峰值,一个正值,一个负值,位于 2 侧为 0。仔细比较有和没有线 y-=y.mean() 的 2 个图

标签: python numpy fft guitar


【解决方案1】:

在运行频率分析之前减去信号的平均值,即在调用triangular_pulse之后:

y-=y.mean()

您将获得非零频率的峰值。这是因为信号有一个不为零的平均分量,它将显示为零频率的分量。

编辑:作为评论,您可以使用 numpy where 重写三角脉冲函数:

def triangular_pulse2(x,xmean,sigma):
    return where(x<xmean,x*sigma/xmean,sigma-(x-xmean)*(sigma/(200-xmean)))

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2012-12-10
    • 2013-03-31
    • 2015-08-19
    • 2020-03-29
    相关资源
    最近更新 更多