如何解释mp3 / wav文件的matplotlib图中的各种颜色

时间:2017-10-25 21:00:17

标签: python audio matplotlib wave

我是一个蟒蛇新手和音频分析新手。如果这不是这个问题的正确位置,请指出我正确的地方。

我有一个只有沉默的mp3音频文件。 使用sox转换为.wav sox input.mp3 output.wav

from scipy.io.wavfile import read
import matplotlib.pyplot as plt
(fs,x)=read('/home/vivek/Documents/VivekProjects/Silence/silence.wav')
##plt.rcParams['agg.path.chunksize'] = 5000 # for preventing overflow error. 
fs
x.size/float(fs)
plt.plot(x) 

生成此图片:

enter image description here

我也使用了这个问题的解决方案:How to plot a wav file

    from scipy.io.wavfile import read
    import matplotlib.pyplot as plt

    # read audio samples
    from scipy.io.wavfile import read
import matplotlib.pyplot as plt

# read audio samples
input_data = read("/home/vivek/Documents/VivekProjects/Silence/silence.wav")
audio = input_data[1]
# plot the first 1024 samples
plt.plot(audio)
# label the axes
plt.ylabel("Amplitude")
plt.xlabel("Time")
# set the title  
plt.title("Sample Wav")
# display the plot
plt.show()

生成此图片:

enter image description here

问题: 我想知道如何解释图表中的不同颜色条(蓝绿色,黄色)。如果你听这个文件只是沉默,我希望看到一条平坦的线条,如果有的话。

我的mp3文件可以从here下载 可以找到sox转换的wav文件here

即使文件是静音的,甚至Dropbox也会生成波形。我似乎无法弄清楚原因。

2 个答案:

答案 0 :(得分:3)

首先,在绘图之前,请务必检查数据的形状。

x.shape
## (3479040, 2)

所以2这里意味着你的.wav文件中有两个通道,默认情况下matplotlib用不同的颜色绘制它们。在这种情况下,您需要逐行切割矩阵。

import matplotlib.pyplot as plt
ind = int(fs * 0.5) ## plot first 500ms
### plot as time series
plt.plot(x[:ind,:])
plt.figure()

#### Visualise distribution
plt.hist(x[:ind,0],bins = 10)
plt.gca().set_yscale('log')

##### 
print x.min(),x.max()
#### -3 3

从图中可以看出,信号的绝对值非常低(-3,3)。根据.wav文件的编码(整数或浮点数),它将被转换为幅度(但可能是非常低的幅度,这就是为什么它是静音的)。

我自己不熟悉精确编码。但是此页面可能有所帮助:http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

  
      
  1. 对于PCM以外的所有格式,格式块必须具有扩展部分。扩展名可以是零长度,但大小   字段(值为0)必须存在。
  2.   
  3. 对于浮点数据,满量程为1.位/样本通常为32或64。
  4.   
  5. 对于log-PCM格式(μ-law和A-law),Rev。3文档指出了比特/样本字段(wBitsPerSample)   应设置为8位。
  6.   
  7. 非PCM格式必须有一个事实块。
  8.   

time_series histogram

PS:如果你想开始一些更高级的音频分析,请检查我发现超实用的workshop,尤其是能量部分和FFT部分。

答案 1 :(得分:1)

我怀疑你的silence.mp3文件的音频非常低(低于人类听觉),因为即使我以最大的扬声器播放声音也听不到它。

所以,我遇到了来自here

mp3的音频

首先我们将mp3音频转​​换为wav。由于父文件是stero,转换后的wav文件也是立体声。为了证明有音频,我们只需要单通道。 一旦我们有单一频道wav音频,我们就可以使用frequency功率级别的颜色条,将timedB索引进行对比。

import scipy.io.wavfile
from pydub import AudioSegment
import matplotlib.pyplot as plt
import numpy as np
from numpy import fft as fft

#read mp3 file
mp3 = AudioSegment.from_mp3("silence.mp3")
#convert to wav
mp3.export("silence.wav", format="wav")
#read wav file
rate,audData=scipy.io.wavfile.read("silence.wav")


#if stereo grab both channels
channel1=audData[:,0] #left
#channel2=audData[:,1] #right channel, we dont need here


#create a time variable in seconds
time = np.arange(0, float(audData.shape[0]), 1) / rate

#Plot spectrogram of frequency vs time
plt.figure(1, figsize=(8,6))
plt.subplot(211)
Pxx, freqs, bins, im = plt.specgram(channel1, Fs=rate, NFFT=1024, cmap=plt.get_cmap('autumn_r'))
cbar=plt.colorbar(im)
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
cbar.set_label('Intensity dB')
plt.show()

正如您在图片中看到的那样,silence.mp3确实包含可能的音频,功率电平为-30至-45 dB。 enter image description here