如何使用python获取声音包络 [英] How to obtain sound envelope using python

查看:100
本文介绍了如何使用python获取声音包络的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,我是 Python 新手,还有声音信号分析.我正在尝试获取出生歌曲(斑胸草雀)的信封.它的信号波动非常快,我尝试了不同的方法.例如,我尝试根据我发现的其他示例使用以下代码绘制信号并获取包络(我在代码上添加了注释以理解它):

Hello I new with python and also with sound signal analysis. I am trying to get the envelope of a birth song (zebra finch). It has a very rapid signal fluctuations and I tried with different approach. For instance I tried to plot the signal and get the envelope with the following code base on other examples that I found (I added comments on the code to understand it):

#Import the libraries
from pylab import *
import numpy
import scipy.signal.signaltools as sigtool
import scipy, pylab
from scipy.io import wavfile
import wave, struct
import scipy.signal as signal

#Open the txt file and read the wave file (also save it as txt file)

f_out = open('mike_1_44100_.txt', 'w')
w     = scipy.io.wavfile.read("mike_1_44100_.wav") #here your sound file

a=w[1]
f_out.write('#time #z' + '\n')

#I print to check
print 'vector w'
print w[0],w[1]
print w

i=w[1].size
p=numpy.arange(i)*0.0000226 #to properly define the time signal with    the sample rate

print 'vector p:'
print p 

x=numpy.dstack([p,a])

print 'vector x:'
print x[0]

#saving file
numpy.savetxt('mike_1_44100_.txt',x[0])

f_out.close()
print 'i:'
print i

# num is the number of samples in the resampled signal.
num= np.ceil(float(i*0.0000226)/0.0015)
print num

y_resample, x_resample = scipy.signal.resample(numpy.abs(a),num, p,axis=0, window=('gaussian',150))

#y_resample, x_resample = scipy.signal.resample(numpy.abs(a), num, p,axis=-1, window=0)

#Aplaying a filter 

W1=float(5000)/(float(44100)/2) #the frequency  for the cut over the sample frequency

(b, a1) = signal.butter(4, W1, btype='lowpass')
aaa=a
slp =1* signal.filtfilt(b, a1, aaa)

#Taking the abs value of the signal the resample and finaly aplying the hilbert transform

y_resample2 =numpy.sqrt(numpy.abs(np.imag(sigtool.hilbert(slp, axis=-1)))**2+numpy.abs(np.real(sigtool.hilbert(slp, axis=-1)))**2)

print 'x sampled'
#print x_resample
print 'y sampled'
#print  y_resample

xx=x_resample #[0]
yy=y_resample #[1]

#ploting with some style

plot(p,a,label='Time Signal') #to plot amplitud vs time
#plot(p,numpy.abs(a),label='Time signal')
plot(xx,yy,label='Resampled time signal Fourier technique Gauss window 1.5 ms ', linewidth=3)
#plot(ww,label='Window', linewidth=3)
#plot(p,y_resample2,label='Hilbert transformed sime signal', linewidth=3)

grid(True)
pylab.xlabel("time [s]")
pylab.ylabel("Amplitde")

legend()
show()

这里我尝试了两件事,第一件事是使用 scipy 的 resample 函数来获取包络,但是我对信号幅度有一些我还不明白的问题(我上传了使用傅立叶技术获得的图像,但是系统不允许我):

Here I tried two things, the first is use the resample function from scipy to get the envelope, but I have some problem with the signal amplitude that I don't understand yet (I uploaded the image obtained with the fourier technique but system does not allow me):

第二种是使用希尔伯特变换得到信封(现在我再次上传了希尔伯特变换的图像系统不允许我) 可以运行我的代码并获得两个图像.但是我把这个链接放在了http://ceciliajarne.web.unq.edu.ar/?page_id=92&preview=true

The second is to use the hilbert transform to get the envelope (now I uploaded the image with the hilbert transform again the system does not allow me) It is possible to run my code and obtain the two images. But ill put the with this link http://ceciliajarne.web.unq.edu.ar/?page_id=92&preview=true

现在信封"再次失败.正如我在一些示例中看到的那样,我尝试过滤信号,但我的信号被衰减,我无法获得包络.有人可以帮助我的代码或获得信封的更好主意吗?可以使用任何鸟鸣作为示例(我可以给你我的),但我需要看看会发生什么复杂的声音不是简单的信号,因为它是非常不同的(简单的声音两种技术都可以).

Now the "envelope" fails again. I tried filtering the signal as i saw in some examples, but my signal is attenuated and i am not able to obtain the envelope. Could anybody help my with my code or with a better idea to get the envelope? It is possible to use as example any bird song (I can give you mine), but i need to see what happen with complex sounds not simple signals, because it is very different (with simple sounds both techniques are ok).

我还尝试修改我在以下位置找到的代码:http://nipy.org/nitime/examples/mtm_baseband_power.html

I also tried to adap the code that I found in: http://nipy.org/nitime/examples/mtm_baseband_power.html

但是我无法为我的信号获得正确的参数,而且我不了解调制部分.我已经问过代码开发人员了,直到等待答案.

But I am not able to get the proper parameters for my signal, and i don't understand the modulation part. I already ask to the code developers, and til waiting the answer.

推荐答案

自从有了鸟鸣调制频率"载波频率"可能远低于载波频率".即使幅度快速变化,也可以通过获取信号的绝对值然后应用长度为 20 ms 的移动平均滤波器来获得包络的近似值.

Since with a bird song the "modulation frequency" probably will be much lower than the "carrier frequency" even with a rapidly varying amplitude, an approximation to the envelope could be obtained by taking the absolute value of your signal and then applying a moving average filter with say 20 ms length.

不过,您是否也对频率变化感兴趣,以充分表征这首歌?在这种情况下,在移动窗口上进行傅立叶变换将为您提供更多信息,即作为时间函数的近似频率内容.这是我们人类听到的,有助于我们区分鸟类.

Still, wouldn't you be interested in frequency variations as well, to adequately characterize the song? In that case, taking the Fourier transform over a moving window would give you far more information, namely the approximate frequency content as a function of time. Which is what we humans hear and helps us discriminate between bird species.

如果您不想要衰减,则不应应用巴特沃斯滤波器,也不应采用移动平均值,而应应用峰值检测.

If you don't want the attenuation, you should neither apply a Butterworth filter nor take the moving average, but apply peak detection instead.

移动平均:每个输出样本是绝对值的平均值,例如50 个前面的输入样本.输出将被衰减.

Moving average: Each output sample is the average of the absolute value of e.g. 50 preceding input samples. The output will be attenuated.

峰值检测:每个输出样本是绝对值的最大值,例如50 个前面的输入样本.输出不会衰减.之后您可以进行低通滤波以去除剩余的阶梯波纹".

Peak detection: Each output sample is the maximum of the absolute value of e.g. 50 preceding input samples. The output will not be attenuated. You can lowpass filter afterward to get rid of the remaining staircase "riple".

你想知道为什么巴特沃斯滤波器会衰减您的信号.如果您的截止频率足够高,则几乎没有,但它似乎被强烈衰减.您的输入信号不是载波(哨声)和调制(包络)的总和,而是乘积.过滤将限制频率内容.剩下的是频率分量(项)而不是因子.您会看到衰减的调制(包络),因为该频率分量确实存在于您的信号中,比原始包络弱得多,因为它没有添加到您的载波中,而是与它相乘.由于与您的包络相乘的载波正弦波并不总是处于最大值,因此包络将被衰减".由调制过程,而不是您的过滤分析.

You wonder why e.g. a Butterworth filter will attenuate your signal. It hardly does if your cutoff frequency is high enough, but it just SEEMS to be strongly attenuated. Your input signal is not the sum of the carrier (whistle) and the modulation (envelope) but the product. Filtering will limit the frequency content. What remains are frequency components (terms) rather than factors. You see an attenuated modulation (envelope) because that frequency component is indeed present in your signal MUCH weaker than the original envelope, since it was not added to your carrier but multiplied with it. Since the carrier sinusoid that your envelope is multiplied with, is not always at its maximum value, the envelope will be "attenuated" by the modulation process, not by your filtering analysis.

简而言之:如果您直接想要(乘法)包络而不是由于调制(乘法)包络引起的(加法)频率分量,请采用峰值检测方法.

In short: If you directly want the (multiplicative) envelope rather than the (additive) frequency component due to modulation (multiplication) with the envelope, take the peak detection approach.

Pythonish"中的峰值检测算法伪代码,仅供参考.

Peak detection algorithm in "Pythonish" pseudocode, just to get the idea.

# Untested, but apart from typos this should work fine
# No attention paid to speed, just to clarify the algorithm
# Input signal and output signal are Python lists
# Listcomprehensions will be a bit faster
# Numpy will be a lot faster

def getEnvelope (inputSignal):
    
    # Taking the absolute value
    
    absoluteSignal = []
    for sample in inputSignal:
        absoluteSignal.append (abs (sample))
    
    # Peak detection
    
    intervalLength = 50 # Experiment with this number, it depends on your sample frequency and highest "whistle" frequency
    outputSignal = []
    
    for baseIndex in range (intervalLength, len (absoluteSignal)):
        maximum = 0
        for lookbackIndex in range (intervalLength):
            maximum = max (absoluteSignal [baseIndex - lookbackIndex], maximum)
        outputSignal.append (maximum)
    
    return outputSignal

这篇关于如何使用python获取声音包络的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆