打印频域图的最高峰值

时间:2016-05-05 11:52:02

标签: python matlab numpy matplotlib scipy

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

代码:

    var filename:string = "checking";
    var ktArgs = ["-genkey", "-v", "-keystore", filename+".keystore", "-alias", filename, "-keyalg", "RSA", "-keysize" ,"2048", "-validity", "1"];
    var cmd = spawn('cmd',['/c', 'keytool'],ktArgs);
    cmd.stdout.on('data', function (data) {
        console.log('stdout: ' + data);
    });
   cmd.stderr.setEncoding('utf8');
    cmd.stderr.on('data', data => {
        cmd.stdin.write("password\n");
        console.log("Server stderr: ", data.toString());
    });
    cmd.stdout.on('data', data => {
        console.log("Server/myBuild/check: stdout:", data.toString());
    });
    cmd.on('close', code => {
        console.log('child process exited with code ' + code);
    });

结果如下:

enter image description here

谢谢, 肖恩

2 个答案:

答案 0 :(得分:4)

由于您使用的是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()

答案 1 :(得分:0)

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是奇数(如你的情况那样),它会变得更加棘手。

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