2016-12-08 2 views
2

J'ai des milliers d'enregistrements que j'utilise pour une application que je construis. Dernièrement, j'ai remarqué que certains enregistrements avaient un écho étrange.Trouver s'il y a un écho dans un fichier son

Les enregistrements sont au format .wav et j'utilise python pour les traiter.

J'ai vu beaucoup de questions dans lesquelles pepole essaie d'annuler l'écho, mais j'ai seulement besoin de localiser ces fichiers.

Y a-t-il un outil ou un code que je peux utiliser pour trouver ces fichiers (pas besoin d'annuler l'écho).

J'ai essayé d'écrire du code pour annuler l'écho, et voir si cela m'aide à comprendre quand un fichier a un écho, mais cela n'a pas fonctionné. Le fichier résultant était juste du bruit, donc je suppose que mon algorithme est faux.

def nlms(u, d, M, step, eps=0.001, leak=0, initCoeffs=None, N=None, returnCoeffs=False): 
    # Initialization 
    if N is None: 
    N = len(u)-M+1 
    if initCoeffs is None: 
    initCoeffs = np.zeros(M) 
    y = np.zeros(N) # Filter output 
    e = np.zeros(N) # Error signal 
    w = initCoeffs # Initial filter coeffs 
    leakstep = (1 - step*leak) 
    if returnCoeffs: 
     W = np.zeros((N, M)) # Matrix to hold coeffs for each iteration 

    # Perform filtering 
    for n in xrange(N): 
     x = np.flipud(u[n:n+M]) # Slice to get view of M latest datapoints 
     y[n] = np.dot(x, w) 
     e[n] = d[n+M-1] - y[n] 

     normFactor = 1./(np.dot(x, x) + eps) 
     w = leakstep * w + step * normFactor * x * e[n] 
     y[n] = np.dot(x, w) 
     if returnCoeffs: 
      W[n] = w 

    if returnCoeffs: 
     w = W 

    return y, e, w 



def CancelEcho(file_path): 
    np.seterr(all='raise') 

    audio_file = wave.open(file_path, 'r') 
    audio_params = audio_file.getparams() 
    new_frames = [] 
    u = 'a' 
    while u != " ": 
     data = audio_file.readframes(1024) 
     u = np.fromstring(data, np.int16) 
     u = np.float64(u) 
     if len(u) ==0: 
     break 
     # Generate received signal d(n) using randomly chosen coefficients 
     coeffs = np.concatenate(([0.8], np.zeros(8), [-0.7], np.zeros(9), 
           [0.5], np.zeros(11), [-0.3], np.zeros(3), 
           [0.1], np.zeros(20), [-0.05])) 

     coeffs.dtype = np.int16 
     d = np.convolve(u, coeffs) 

     # Add background noise 
     v = np.random.randn(len(d)) * np.sqrt(5000) 
     d += v 

     # Apply adaptive filter 
     M = 100 # Number of filter taps in adaptive filter 
     step = 0.1 # Step size 
     y, e, w = nlms(u, d, M, step, returnCoeffs=True) 

     new_frames.extend(y) 

    audio_file.close() 
    audio_file = wave.open(out_file, 'w') 
    audio_file.setparams(audio_params) 
    audio_file.writeframes(y.astype(np.int16).tostring()) 
    audio_file.close() 
+0

Um .. Tu es code cancel echo génère un bruit d'écho dans le fichier, puis supprime cela. – cjds

+0

"mais cela n'a pas fonctionné" - ce qui n'a pas fonctionné, le code pour annuler l'écho ou le coup de pouce dans la compréhension que vous espériez provenir de l'écriture du code? –

Répondre

0

Une idée serait de prendre une partie du fichier, puis déplacer que dans le reste du dossier et trouver le facteur multiplicateur qu'il prendrait pour un signal de se transformer en l'autre.

code attribution: https://docs.python.org/2/library/audioop.html

Cela peut fonctionner:

def echocancel(outputdata, inputdata): 
    pos = audioop.findmax(outputdata, 800) # one tenth second 
    out_test = outputdata[pos*2:] 
    in_test = inputdata[pos*2:] 
    ipos, factor = audioop.findfit(in_test, out_test) 
    # Optional (for better cancellation): 
    # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], 
    #    out_test) 
    return factor 

Plus le facteur est de 1,0, plus il y a un écho

+0

Comment créer des données de sortie/d'entrée? – user844541