動態信號週期檢測

一段信號的週期可能會動態變化,下面的代碼是根據信號幅度極大值的分佈來判斷是否存在週期,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()
    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章