gpt4 book ai didi

python - 打印频域图的最高峰值

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:09 25 4
gpt4 key购买 nike

我试图在时域和频域中绘制自制四边形的振荡图。如何在频域图中打印最高峰的值?

代码:

import matplotlib.pyplot as plt
import numpy as np
from scipy import fft, arange

csv = np.genfromtxt ('/Users/shaunbarney/Desktop/Results/quadOscillations.csv', delimiter=",",dtype=float)
x = csv[:,0]
y = csv[:,1]
x = x - 6318 #Remove start offset
av=0
for i in xrange(1097): #Calculate average sampling time in seconds oscillations
if i == 1076:
avSampleTime = av/1097000 #
break
av = av + (x[i+1]-x[i])

Fs = 1/avSampleTime #Average sampling freq.
n = 1079 #no.Samples
k = arange(n)
Ts = n/Fs
frq = k/Ts #Frequency range two sided
frq = frq[range(n/2)] #Frequency range one sided
Y = fft(y)/n #Fast fourier transfors
Y = Y[range(n/2)] #Normalise

# PLOTS

plt.subplot(2,1,1)
plt.plot(frq,abs(Y),'r') # plotting the spectrum
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')
plt.grid('on')
plt.subplot(2,1,2)
plt.plot(x,y)
plt.xlabel('Time (ms)')
plt.ylabel('Angle (degrees)')
plt.grid('on')
plt.show()

结果如下:

enter image description here

谢谢,肖恩

最佳答案

由于您使用的是 numpy,因此只需使用 numpy.maxnumpy.argmax确定峰值以及峰值的位置,以便您可以将其打印到屏幕上。找到此位置后,索引到频率数组中以获得最终坐标。

假设在运行代码时已创建所有变量,只需执行以下操作:

mY = np.abs(Y) # Find magnitude
peakY = np.max(mY) # Find max peak
locY = np.argmax(mY) # Find its location
frqY = frq[locY] # Get the actual frequency value

peakY 包含图表中最大的幅度值,frqY 包含此最大值(即峰值)所在的频率。作为奖励,您可以用不同的颜色在图表上绘制它,并使用更大的标记将其与主要幅度图区分开来。请记住,调用多个 plot 调用只会附加到当前焦点图形的顶部。因此,绘制您的频谱,然后将此点绘制在频谱的顶部。我将使点的大小大于图的厚度,并用不同的颜色标记点。您或许还可以制作一个反射(reflect)该最大峰值和相应位置的标题。

还要记住,这是在幅度上完成的,所以在绘制实际幅度之前,只需执行以下操作:

#        PLOTS
# New - Find peak of spectrum - Code from above
mY = np.abs(Y) # Find magnitude
peakY = np.max(mY) # Find max peak
locY = np.argmax(mY) # Find its location
frqY = frq[locY] # Get the actual frequency value

# Code from before
plt.subplot(2,1,1)
plt.plot(frq,abs(Y),'r') # plotting the spectrum

# New - Plot the max point
plt.plot(frqY, peakY, 'b.', markersize=18)

# New - Make title reflecting peak information
plt.title('Peak value: %f, Location: %f Hz' % (peakY, frqY))

# Rest of the code is the same
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')
plt.grid('on')
plt.subplot(2,1,2)
plt.plot(x,y)
plt.xlabel('Time (ms)')
plt.ylabel('Angle (degrees)')
plt.grid('on')
plt.show()

关于python - 打印频域图的最高峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37049887/

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