通过傅立叶变换找到波的不连续性wav文件的滴答声

问题描述

    audio_sample,sampling_rate = librosa.load('a.wav',sr=None)

    S = np.abs(librosa.stft(audio_sample,n_fft=1024,hop_length=512,win_length=1024,window=signal.hann))
    
    mag_db = librosa.amplitude_to_db(S)
    mag_n = _normalize(mag_db)
    librosa.display.specshow(mag_n,y_axis='linear',x_axis='time',sr=sampling_rate)

我做了一些 stft ,然后做了 spechow 。但是我想找到波浪不连续的时间点。

示例)我想知道波形文件的不连续点

我的意思是这样

enter image description here

解决方法

您只需要使用导数来查找波动中的不连续性。要获取波的导数,可以将 convolution 与滤波器一起使用。 这是示例代码:

import numpy as np
import  matplotlib.pyplot as plt

# generating the wave
angle1 = np.linspace(0,5*np.pi/2,100)
wave1  = np.sin(angle1)
angle2 = np.linspace(0,3*np.pi/2)
wave2  = np.sin(angle2)
angle3 = np.linspace(np.pi/2,2*np.pi)
wave3  = np.sin(angle3)
wave   = np.append(wave1,wave2)
wave   = np.append(wave,wave3)

# differentiation
filter = [-1,1]
dif    = np.convolve(wave,filter)
absdif = np.abs(dif)
print('discontinuity at:',np.where(absdif > 0.75)[0])

plt.subplot(3,1,1)
plt.plot(wave,label='input wave')
plt.subplot(3,2)
plt.plot(dif,label='dirivative')
plt.subplot(3,3)
plt.plot(absdif,label='absolut of derivative')

plt.show()

输出图: enter image description here