Récemment, j'ai fait une petite opération sur des fichiers audio.
En référence à cette page, je l'ai lu comme un entier de type 16 bits `` numpy.ndarray ''.
Afficher la forme d'onde sonore en Python (fichier Wav)
import numpy as np
import wave
def read_wavefile(filename):
"""fichier au format wav numpy.Lire comme ndarray"""
wf = wave.open(filename , 'r')
buf = wf.readframes(wf.getnframes())
#Convertir les données binaires en entier 16 bits
return np.frombuffer(buf, dtype='int16')
Je voulais prendre la valeur absolue de cette voix, je vais donc convertir le tableau avec
numpy.absolute```.
arr = read_wavefile('test.wav')
arr_abs = np.absolute(arr)
Cependant, la valeur -32768 '' dans celle-ci reste sans être convertie en valeur positive. Si vous prenez l'histogramme, vous pouvez voir que les autres valeurs négatives sont positives, mais qu'il ne reste que
-32768 '' (bien que les valeurs soient correctes).
import matplotlib.pyplot as plt
print(type(arr_abs))
# => <class 'numpy.ndarray'>
print(arr_abs.min())
# => -32768
plt.hist(np.absolute(arr), bins=100)
plt.show()
Cela a été résolu en lisant comme un entier 32 bits lors de la première lecture.
def read_wavefile(filename):
"""fichier au format wav numpy.Lire comme ndarray"""
wf = wave.open(filename , 'r')
buf = wf.readframes(wf.getnframes())
#Convertir les données binaires en entier 32 bits
arr = np.frombuffer(buf, dtype='int16')
return arr.astype(np.int32)
arr = read_wavefile('test.wav')
arr_abs = np.absolute(arr)
print(arr_abs.min())
# => 0
C'est probablement parce que les entiers 16 bits ne peuvent représenter que de -32768 à 32767, donc numpy.absolue
Je pense que la valeur obtenue en convertissant le code avec `ne peut pas être convertie et la valeur telle qu'elle est est sortie.
(Je n'ai trouvé aucune documentation détaillant ces spécifications)
Lors de l'utilisation de programmes de calcul numérique tels que le langage numpy et R de Python, il est souvent reconnu que le type de données du langage C est utilisé tel quel pour accélérer, il est donc nécessaire d'être plus prudent que d'habitude. Fait.
À propos, la version de `` numpy``` utilisée cette fois est la 1.13.0.
$ pip freeze | grep numpy
numpy==1.13.0
Recommended Posts