异步社区

异步社区是国内领先的IT专业图书社区,由人民邮电出版社主办,致力于优质学习内容的出版和分享。

34篇博客

使用正确的图表理解数据(二):理解频谱图下篇

异步社区2018-12-27 11:06
7.3.3 工作原理
首先需要加载一个声音文件,这通过调用scikits.audiolab.SndFile方法并传入一个文件名来完成。该方法将实例化一个声音对象,通过该对象我们可以查询数据并调用其中的方法。


为了读取频谱图所需要的数据,需要从声音对象中读取数据帧。这通过read_frames()完成,该方法接收开始帧和结束帧的参数。把采样率和想要可视化的时间点(start, end)相乘便可以计算出帧数量。


7.3.4 补充说明
如果找不到音频文件(wave),可以生成一个。生成方法很简单,具体如下。
import numpy
def _get_mask(t, t1, t2, lvl_pos, lvl_neg):
if t1 >= t2:
raise ValueError("t1 must be less than t2")
return numpy.where(numpy.logical_and(t > t1, t < t2), lvl_pos,
lvl_neg)
def generate_signal(t):
sin1 = numpy.sin(2 * numpy.pi * 100 * t)
sin2 = 2 * numpy.sin(2 * numpy.pi * 200 * t)
# add interval of high pitched signal
sin2 = sin2 * _get_mask
(t,2,5,1.0,0.0)
noise = 0.02 * numpy.random.randn(len(t))
final_signal = sin1 + sin2 + noise
return final_signal
if __name__ == '__main__':
step = 0.001
sampling_freq=1000
t = numpy.arange(0.0, 20.0, step)
y = generate_signal(t)
# we can visualize this now
# in time
ax1 = plt.subplot(211)
plt.plot(t, y)
# and in frequency
plt.subplot(212)
plt.specgram(y, NFFT=1024, noverlap=900,
Fs=sampling_freq, cmap=plt.cm.gist_heat)
plt.show()


这将生成图7-3所示的信号,其中顶部的图形是生成的信号。这里,x轴表示时间,y轴表示信号的幅值。底部的图形是相同的信号在频率域中的呈现。这里,x轴如顶部图一样表示时间(通过选择采样率来匹配时间),y轴表示信号的频率。


原文网址:       https://www.epubit.com/book/detail/21642
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。