一段信號的週期可能會動態變化,下面的代碼是根據信號幅度極大值的分佈來判斷是否存在週期,https://blog.csdn.net/seTaire/article/details/99968948主要是在該方法上做了一點改變。
實驗結果:
import librosa
path = "/Users/birenjianmo/Desktop/learn/librosa/input/1你好.wav"
import librosa.display
import matplotlib.pyplot as plt
y, sr = librosa.load(path)
yy = y.tolist()
def gettopdata(y):
data = []
for i in range(1,len(y)-1):
if y[i]>0 and y[i-1]<y[i]<y[i+1]:
data.append(i)
return data
def findall(a):
result = []
data = []
for i in range(1,len(a)):
data.append( a[i]-a[i-1] )
for pos in range(5, len(data)//3):
for i in range(len(data)-pos):
if abs(data[i] - data[i+pos]) < abs(data[i]) * 0.05:
# if data[i] == data[i+pos]:
getp = True
p = [a[i]]
r = 1
while r < (len(data)-i)//pos:
for j in range(pos):
if abs(data[i+j] - data[i+pos*r+j]) > abs(data[i+j]) * 0.05:
# if data[i+j] == data[i+pos*r+j]:
getp = False
break
if not getp:
break
else:
p.append(a[i+pos*r])
r += 1
if len(p) > 4:
print(pos)
print(p)
result.append(p)
return result
if __name__ == '__main__':
a = gettopdata(yy)
indexs = findall(a)[0]
for i in indexs:
plt.scatter(i-indexs[0]+1, y[i+1])
plt.plot(y[indexs[0]:indexs[-1]])
plt.show()