Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从mp3绘制spectrogram图_Python_Audio_Signal Processing - Fatal编程技术网

Python 从mp3绘制spectrogram图

Python 从mp3绘制spectrogram图,python,audio,signal-processing,Python,Audio,Signal Processing,我试图直接从Python2.7.3(使用ubuntu)中的mp3文件中绘制一个spectrogram。我可以从一个wav文件中执行它,如下所示 #!/usr/bin/python from scikits.audiolab import wavread from pylab import * signal, fs, enc = wavread('XC124158.wav') specgram(signal) show() 用mp3文件而不是wav文件做同样的事情,最干净的方法是什么?如果可以

我试图直接从Python2.7.3(使用ubuntu)中的mp3文件中绘制一个spectrogram。我可以从一个wav文件中执行它,如下所示

#!/usr/bin/python
from scikits.audiolab import wavread
from pylab import *

signal, fs, enc = wavread('XC124158.wav')
specgram(signal)
show()

用mp3文件而不是wav文件做同样的事情,最干净的方法是什么?如果可以避免的话,我不想将所有mp3文件都转换成wav。

我会安装Debian/Ubuntu软件包并调用
avconv
将mp3解码为临时wav文件:


编辑:你的另一个问题已经结束了,所以我将在这里用一个简单的带通滤波示例来扩展我的答案。在您链接的文件中,看起来大部分鸟鸣集中在4 kHz-5.5 kHz

import os
from subprocess import check_call
from tempfile import mktemp
from scikits.audiolab import wavread, play
from scipy.signal import remez, lfilter
from pylab import *

# convert mp3, read wav
mp3filename = 'XC124158.mp3'
wname = mktemp('.wav')
check_call(['avconv', '-i', mp3filename, wname])
sig, fs, enc = wavread(wname)
os.unlink(wname)

# bandpass filter
bands = array([0,3500,4000,5500,6000,fs/2.0]) / fs
desired = [0, 1, 0]
b = remez(513, bands, desired)
sig_filt = lfilter(b, 1, sig)
sig_filt /=  1.05 * max(abs(sig_filt)) # normalize

subplot(211)
specgram(sig, Fs=fs, NFFT=1024, noverlap=0)
axis('tight'); axis(ymax=8000)
title('Original')
subplot(212)
specgram(sig_filt, Fs=fs, NFFT=1024, noverlap=0)
axis('tight'); axis(ymax=8000)
title('Filtered')
show()

play(sig_filt, fs)

另一种绘制mp3文件频谱图的非常简单的方法

from pydub import AudioSegment
import matplotlib.pyplot as plt
from scipy.io import wavfile
from tempfile import mktemp

mp3_audio = AudioSegment.from_file('speech.mp3', format="mp3")  # read mp3
wname = mktemp('.wav')  # use temporary file
mp3_audio.export(wname, format="wav")  # convert to wav
FS, data = wavfile.read(wname)  # read wav file
plt.specgram(data, Fs=FS, NFFT=128, noverlap=0)  # plot
plt.show()
这使用了
pydub
库,与调用外部命令相比更方便。 这样,您可以迭代所有
.mp3
文件,而无需在打印之前将其转换为
.wav


谢谢。这是可行的,但它给出的光谱图略有不同。原来的mp3在。除了x轴的标签不同之外,主要区别在于使用原始mp3和代码的版本在图像的末尾和顶部都有一个空白段。我制作wav版本只是通过对XC124158.mp3进行lame解码。我只是看到你可能也知道。如果你对此也有任何看法,那就太好了。我将其简化为只使用
mktemp
(结果表明avconv无法在管道中写入正确的wav头),并在FFT中添加了更多的容器,没有重叠。轴(“紧”)去除空白部分。您可能还需要使用轴(ymax=8000),因为大部分功率低于8 kHz。欢迎使用。滤波器并不是一个完美的解决方案,但就其简单性而言,它提供的效果相当不错。典型的音频不是频谱稳定的,所以通常需要自适应滤波。@erykson,谢谢。现在我有一个小任务,就是在所有的噪音中寻找鸟的声音。你知道在你的python代码播放的版本中,嗡嗡声/噼啪声是从哪里来的吗?这应该是公认的答案,最简单,可以直接从python在一个脚本中完成。