使用傅立叶变换(wav 文件的滴答声)找到波的不连续性
find wave discontinuity by using fourier transform( wav file's tick noise)
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。但我想找到波不连续的点(时间)。
例子)我想知道波形文件的不连续点
我的意思是这样的
您只需要使用 导数 即可找到波浪中的不连续性。为了对波进行导数,我们可以使用 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, 1, 2)
plt.plot(dif, label='dirivative')
plt.subplot(3, 1, 3)
plt.plot(absdif, label='absolut of derivative')
plt.show()
输出图:
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。但我想找到波不连续的点(时间)。
例子)我想知道波形文件的不连续点
我的意思是这样的
您只需要使用 导数 即可找到波浪中的不连续性。为了对波进行导数,我们可以使用 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, 1, 2)
plt.plot(dif, label='dirivative')
plt.subplot(3, 1, 3)
plt.plot(absdif, label='absolut of derivative')
plt.show()
输出图: