段大小=512
window='hanning',要使用的窗口类型
noverlap=noverlap)段间重叠
参考值=(1/np.sqrt(2)**2)仅0.5;)
填充_至=-150*(np.一个如(p))低于-150db的值不相关。
plt.ylim([-90,6])
plt.ylabel('功率谱,db')
输出窗口的框架遵循大胆的风格。他们扔掉了第一个低频垃圾箱,把所有东西都切到-90db以下。

它基本上是频率箱中的能量。
import numpy as np
from scipy.io import wavfile
from scipy import signal
from matplotlib import pyplot as plt
segment_size = 512
fs, x = wavfile.read('sine3k6k.wav')
x = x / 32768.0 # scale signal to [-1.0 .. 1.0]
noverlap = segment_size / 2
f, Pxx = signal.welch(x, # signal
fs=fs, # sample rate
nperseg=segment_size, # segment size
window='hanning', # window type to use
nfft=segment_size, # num. of samples in FFT
detrend=False, # remove DC part
scaling='spectrum', # return power spectrum [V^2]
noverlap=noverlap) # overlap between segments
# set 0 dB to energy of sine wave with maximum amplitude
ref = (1/np.sqrt(2)**2) # simply 0.5 ;)
p = 10 * np.log10(Pxx/ref)
fill_to = -150 * (np.ones_like(p)) # anything below -150dB is irrelevant
plt.fill_between(f, p, fill_to )
plt.xlim([f[2], f[-1]])
plt.ylim([-90, 6])
# plt.xscale('log') # uncomment if you want log scale on x-axis
plt.xlabel('f, Hz')
plt.ylabel('Power spectrum, dB')
plt.grid(True)
plt.show()
segment_size
Size
- 默认窗口类型为“Hanning”,如果需要,可以更改它。
segment_size/2
- 输出窗口的框架遵循大胆的风格。他们扔掉了第一个低频垃圾箱,把所有东西都切到-90db以下。

基本上就是频率仓中的能量。
你需要选择一些参考点。以分贝为单位的图表总是与某件事有关的。当您选择最大能量箱作为参考时,您的0db点是最大能量(显然)。可接受设置为最大振幅正弦波的参考能量。参见ref
log10
是10而不是20,这是因为我们要处理的是信号的功率而不是振幅。
是的,任何低于-40dB的信号通常被认为是不可忽视的。