Python 中的频谱图
Spectrogram plot in Python
我应用了以下代码来创建频谱图
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
# Define the signal
Fs = 1e4 # Sampling Frequency
# Sin wave with Amplite 1 unit, 50Hz, for duration 0-5 seconds
N1 = (1e5)/2
time1 = np.arange(N1) / float(Fs)
x1 = 1*np.sin(2*np.pi*50*time1)
# Sin wave with Amplite 0.008 units, 100Hz, for duration 5-10 seconds
time2 = np.arange(N1,2*N1) / float(Fs)
x2 = 0.008*np.sin(2*np.pi*100*time2)
# Concatenate above two waves
T =np.concatenate((time1,time2))
Y =np.concatenate((x1,x2))
# Plot the waves
plt.plot(T , Y)
plt.title('Time Data')
plt.ylabel('Amplitude')
plt.xlabel('Time [sec]')
plt.show()
# spectrogram
freq_axis, time_axis, Sxx = signal.spectrogram(Y, Fs)
# Plot the spectrogram
plt.pcolormesh(time_axis, freq_axis, Sxx)
plt.title('Spectrogram')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.xlim(0,10)
plt.ylim(0,200)
plt.show()
频谱图的结果是这样的:
在这个图中,主频率似乎是从 0-5 秒(黄色区域)的 37Hz 到 75Hz。
然而,在创建的信号中,唯一的主导频率。从 0-5 秒是 50 赫兹。
此外,无法识别持续时间为 5-10 秒的 0.008 单位振幅、100Hz 的信号。
有人可以告诉我哪里错了吗?
另外,有什么办法可以在频谱图的图 window 旁边描绘一个颜色条,以便可以看到与颜色对应的幅度值?
先回答colorbar的问题。 Matplotlib.pyplot 提供创建颜色条的功能。您只需添加
plt.colorbar()
向绘图添加标准颜色条。
然后是你最初的问题。您可能需要更好地了解 signal.spectrogram() 的作用。要直观地了解结果,您必须知道用于从频时域中的时间转换信号的函数在提供的精度方面受到限制。因此,您可以对频率进行非常准确的计算,但不知道频率何时出现,或者您在何时非常准确,但在哪个频率上却不准确。
在您的示例中,频率计算得不是很准确,导致出现所谓的频率仓。 bin 大小是黄色块的高度。所以频谱图识别了各自 bin 中的两个频率,因此一个 bin 是黄色的,另一个是蓝色的。
我应用了以下代码来创建频谱图
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
# Define the signal
Fs = 1e4 # Sampling Frequency
# Sin wave with Amplite 1 unit, 50Hz, for duration 0-5 seconds
N1 = (1e5)/2
time1 = np.arange(N1) / float(Fs)
x1 = 1*np.sin(2*np.pi*50*time1)
# Sin wave with Amplite 0.008 units, 100Hz, for duration 5-10 seconds
time2 = np.arange(N1,2*N1) / float(Fs)
x2 = 0.008*np.sin(2*np.pi*100*time2)
# Concatenate above two waves
T =np.concatenate((time1,time2))
Y =np.concatenate((x1,x2))
# Plot the waves
plt.plot(T , Y)
plt.title('Time Data')
plt.ylabel('Amplitude')
plt.xlabel('Time [sec]')
plt.show()
# spectrogram
freq_axis, time_axis, Sxx = signal.spectrogram(Y, Fs)
# Plot the spectrogram
plt.pcolormesh(time_axis, freq_axis, Sxx)
plt.title('Spectrogram')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.xlim(0,10)
plt.ylim(0,200)
plt.show()
频谱图的结果是这样的:
在这个图中,主频率似乎是从 0-5 秒(黄色区域)的 37Hz 到 75Hz。 然而,在创建的信号中,唯一的主导频率。从 0-5 秒是 50 赫兹。
此外,无法识别持续时间为 5-10 秒的 0.008 单位振幅、100Hz 的信号。
有人可以告诉我哪里错了吗?
另外,有什么办法可以在频谱图的图 window 旁边描绘一个颜色条,以便可以看到与颜色对应的幅度值?
先回答colorbar的问题。 Matplotlib.pyplot 提供创建颜色条的功能。您只需添加
plt.colorbar()
向绘图添加标准颜色条。
然后是你最初的问题。您可能需要更好地了解 signal.spectrogram() 的作用。要直观地了解结果,您必须知道用于从频时域中的时间转换信号的函数在提供的精度方面受到限制。因此,您可以对频率进行非常准确的计算,但不知道频率何时出现,或者您在何时非常准确,但在哪个频率上却不准确。
在您的示例中,频率计算得不是很准确,导致出现所谓的频率仓。 bin 大小是黄色块的高度。所以频谱图识别了各自 bin 中的两个频率,因此一个 bin 是黄色的,另一个是蓝色的。