异步社区

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

34篇博客

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

异步社区2018-12-27 11:02
7.3理解频谱图
频谱图是随时间变化的频谱表现,它显示了信号的频谱强度随时间的变化。频谱图是把声音或者其他信号的频谱以可视化的方式呈现出来。


它被用在很多科学领域中,从声音指纹如声音识别,到雷达工程学和地震学。通常,频谱图的布局如下:x轴表示时间,y轴表示频率,第三个维度是频率—时间对的幅值,通过颜色表示。因为这是三维的数据,因此我们也可以创建3D图表来表示,其中强度表示为z轴上的高度。3D图表的问题是人们不太容易理解以及进行比较,而且它比2D图表占用更多的空间。


7.3.1 准备工作
对于严谨的信号处理,我们将会研究更低级别的细节,进而能从中发现模式并自动识别一定的特征。但是对于本节数据可视化的内容,我们将借助一些著名的Python库来读取音频文件,对它进行采样,然后绘制出频谱图。


为了能读取WAV文件并把声音可视化出来,需要做一些准备工作。我们需要安装libsndfile1系统库来读/写音频文件。这可以通过你喜欢的包管理工具完成。对于Ubuntu,使用以下命令:$ sudo apt-get install libsndfilel-dev.安装dev包非常重要,它包含了头文件,从而通过pip可以创建scikits.audiolab模块。我们也可以安装libasound和ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)头来避免编译时警告。这是可选的,因为我们不打算使用ALSA库提供的特性。


对于Ubuntu Linux,执行以下命令:$ sudo apt-get install libasound2-dev我们用pip安装用来读取WAV文件的scikits.audiolab:$ pip install scikits.audiolab永远记住要进入当前工程的虚拟环境,因为这样才不会弄脏你的系统库。


7.3.2 操作步骤
本节将使用预录制的声音文件test.wav,该文件可以在本书的文件代码库中找到,但你也可以自己生成一个样本文件。在这个例子中,我们顺序地执行下面的步骤。
(1)读取包含一个已经录制的声音样本的WAV文件。
(2)通过NFFT设置用于傅里叶变换的窗口长度。
(3)在采样时,使用noverlap设置重叠的数据点。
import os
from math import floor, log
from scikits.audiolab import Sndfile
import numpy as np
from matplotlib import pyplot as plt
# Load the sound file in Sndfile instance
soundfile = Sndfile("test.wav")
# define start/stop seconds and compute start/stop frames
start_sec = 0
stop_sec = 5
start_frame = start_sec * soundfile.samplerate
stop_frame = stop_sec * soundfile.samplerate
# go to the start frame of the sound object
soundfile.seek(start_frame)
# read number of frames from start to stop
delta_frames = stop_frame - start_frame
sample = soundfile.read_frames(delta_frames)
map = 'CMRmap'
fig = plt.figure(figsize=(10, 6), )
ax = fig.add_subplot(111)
# define number of data points for FT
NFFT = 128
# define number of data points to overlap for each block
noverlap = 65
pxx, freq, t, cax = ax.specgram(sample, Fs=soundfile.samplerate,
NFFT=NFFT, noverlap=noverlap,
cmap=plt.get_cmap(map))
plt.colorbar(cax)
plt.xlabel("Times [sec]")
plt.ylabel("Frequency [Hz]")
plt.show()


代码生成的频谱图如图7-2所示。


NFFT定义了每一个块中用于计算离散傅里叶变换的数据点的数量。当NFFT的值为2的幂次方时计算效率最高。窗口可以重叠,重叠(也就是重复)的数据点数量通过参数noverlap指定。


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