【问题标题】:Print highest peak value of the frequency domain plot打印频域图的最高峰值
【发布时间】:2016-08-31 04:47:12
【问题描述】:

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

代码:

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()

结果如下:

谢谢, 肖恩

【问题讨论】:

    标签: python matlab numpy matplotlib scipy


    【解决方案1】:
    print("maximum of |Y| is: %.4g" % np.max(np.abs(Y)))
    

    其他建议:使用数组切片:Y = Y[:n/2+1] 而不是 Y = Y[range(n/2)]。具有 n 个输入(n 为偶数)的实值数据集的傅立叶变换将具有 n/2+1 个频率分量。您的索引错过了最后一点。如果 n 是奇数(如您的情况),它会变得更加棘手。

    附注:最好提供一个包含问题的独立示例,即不依赖于您计算机上的文件的示例。

    【讨论】:

      【解决方案2】:

      由于您使用的是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 调用只会附加在当前焦点图形的顶部。因此,绘制您的光谱,然后将此点绘制在光谱顶部。我将使点的大小大于绘图的厚度,并用不同的颜色标记点。您也可以制作一个反映这个最大峰值和相应位置的标题。

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

      #        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()
      

      【讨论】:

        猜你喜欢
        • 2021-08-17
        • 2022-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-22
        • 1970-01-01
        相关资源
        最近更新 更多