2
votes

Comment obtenir une liste d'amplitude et de fréquence à partir d'un fichier wav

Nous essayons de créer un programme pour obtenir une liste d'amplitudes et de fréquences à partir d'un fichier .wav, en l'essayant en Python.

Nous avons essayé pyaudio pour cela je ne connais pas grand-chose à pyaudio, donc j'ai besoin de quelques suggestions sur

import scipy
import numpy as np

file = '123.wav'
from scipy.io import wavfile as wav
fs, data = wav.read(file)
length=len(data.shape)
#if length==2:
#    data= data.sum(axis=1)/2
n = data.shape[0]
sec = n/float(fs)
ts = 1.00/fs
t = scipy.arange(0,sec,ts)
FFT = abs(scipy.fft(data))
FFT_size = FFT[range(n//2)]
freq = scipy.fftpack.fftfreq(data.size, t[1]-t[0])
max_freq = max(freq)
min_freq = min(freq)
plot_freq(freq, n, t, data)

Le résultat réel renvoyé est la liste de fréquences. Je veux aussi une liste d'amplitude, je ne sais pas comment l'obtenir.


3 Réponses :


0
votes

typiquement, un appel à une API fft renverra un tableau de nombres imaginaires où chaque élément du tableau contient un nombre complexe sous la forme (Areal, AImaginary) où chaque élément du tableau représente une fréquence (la valeur de la fréquence est implicite par l'index du tableau [trouver la formule pour calculer la fréquence en fonction de l'index du tableau])

sur l'élément de tableau complexe 0 représente la fréquence 0 qui est votre décalage de courant continu, puis la fréquence de chaque fréquence suivante est calculée en utilisant

XXX

pour que cela soit significatif, vous devez avoir une connaissance préalable de la fréquence d'échantillonnage de votre série temporelle d'entrée source (audio ou autre) et le nombre d'échantillons est juste la longueur de l'audio brut en virgule flottante tableau de courbes que vous avez introduit dans votre appel fft

... au fur et à mesure que vous parcourez ce tableau de nombres complexes, calculez l'amplitude en utilisant Areal et AImaginary du nombre complexe de chaque intervalle de fréquences en utilisant la formule

curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples

lorsque vous parcourez le tableau complexe renvoyé par votre appel fft b e conscient de la notion de limite de Nyquist ce qui signifie que vous ne consommez que la première moitié du nombre d'éléments de ce tableau complexe (et doublez la magnitude de chaque fréquence - voir formule ci-dessus)

... voir le pseudocode complet sur Obtenir la fréquence avec la plus grande amplitude de FFT

... J'ai exécuté votre code et rien ne s'est passé ... quelle est la signification de votre python

[plage (n // 2)]


2 commentaires

J'obtiens une liste freq qui est la liste de fréquences, et après cela je la trace en utilisant cette fonction plot_freq (). Voici le code pour plot_freq () def plot_freq (freqs, N, t, signal): fft_freqs = np.array (freqs) freqs_side = freqs [range (N // 2)] # one side frequency range fft_freqs_side = np.array (freqs_side) plt.subplot (311) p1 = plt.plot (t, signal, "g") plt.xlabel ('Time') plt.ylabel ('Frequency')


range (n // 2) commencera de 0 à n / 2 si n / 2 arrive au point, puis arrondit vers le haut.



0
votes

Vous voudrez peut-être la hauteur, pas la fréquence spectrale, qui est un algorithme différent de la simple utilisation d'une FFT pour trouver la magnitude la plus élevée. Une FFT renvoie toute la gamme de fréquences spectrales (chaque fréquence jusqu'à Fs / 2, pas seulement une fréquence), dans votre cas pour l'ensemble du fichier. Et la magnitude la plus élevée n'est souvent pas pour la fréquence de hauteur tonale (peut-être plutôt pour une harmonique aiguë).

Vous avez également pris la FFT du fichier entier, pas un tas de FFT pour des tranches de temps (généralement de petites fenêtres qui se chevauchent) à l'incrément de temps que vous désirez pour la résolution temporelle de votre liste. Cela produira un tableau temporel de tous les tableaux de fréquences FFT (donc, un tableau 2D). Habituellement appelé un spectrogramme. Il peut y avoir une fonction intégrée pour cela dans certaines bibliothèques.


2 commentaires

pouvez-vous me dire comment obtenir la fréquence et l'amplitude de la hauteur tonale.


C'est une nouvelle question. Recherchez ici sur stackoverflow (ou sur dsp.stackexchange), car cette question a peut-être déjà été posée et répondue sous diverses formes à plusieurs reprises.



-1
votes

Puis-je faire une amplitude à partir de cette formule

la fréquence de l'onde est définie par ce qui entraîne l'oscillation dans le milieu. Des exemples sont un haut-parleur qui installe une onde sonore ou la main qui secoue l'extrémité d'une corde étirée. la vitesse de l'onde est une propriété du milieu. la longueur d'onde de l'onde est alors déterminée par la fréquence et la vitesse: λ = v / f

Je ne sais pas que ce sera le bon processus ou pas


0 commentaires