8/1 Ajout d'un diagramme de tracé de la transformation de Fourier de la source sonore de base et d'autres explications détaillées.
Comparez la transformée de Fourier d'un composite de deux sources sonores avec le composite de la transformée de Fourier de chaque source sonore.
La plupart des ondes sont constituées de sinusoïdes de différentes fréquences. La transformation de Fourier consiste à découvrir quel type d'onde sinusoïdale est additionné à quel rapport. Souvent appelée «conversion du domaine temporel au domaine fréquentiel».
Utilisez la transformée de Fourier discrète. Très simplement, c'est une transformée de Fourier d'un signal numérique. J'ai utilisé Python 3.7 et numpy.
import numpy as np
import matplotlib.pyplot as plt
import wave
def wave_open(file):
wf = wave.open(file, "rb")
nc = wf.getnchannels() #Nombre de canaux(Monaural ou stéréo)
qn = wf.getsampwidth() #Nombre d'octets de quantification(1byte=8bit)
sr = wf.getframerate() #Fréquence d'échantillonnage
fl = wf.getnframes() #Tous les cadres(fl/sr=time(s))
data = wf.readframes(fl) #Lire tous les cadres(binaire)
data = np.frombuffer(data, dtype="int16") #Faites-en un tableau numpy entier
if nc==2:
data=data[::2] #N'utilisez qu'un seul canal
wf.close()
return nc,qn,sr,fl,data
w_file_gt = wave_open("DisGtr-F.wav")
nc_gt = w_file_gt[0] #Monaural ou stéréo
qn_gt = w_file_gt[1] #Nombre d'octets de quantification
sr_gt = w_file_gt[2] #Fréquence d'échantillonnage
fl_gt = w_file_gt[3] #Tous les cadres
# x~x+1[s]Utiliser 1 seconde de données
timex = 5
data_size_s = sr_gt*timex
data_size_e = sr_gt*(timex+1)
data_gt = w_file_gt[4][data_size_s:data_size_e]
Les données sonores et la fréquence d'échantillonnage ont été acquises à l'aide du module Wave. Ensuite, nous effectuerons une transformée de Fourier. Les données sonores sont une source sonore de guitare 16 bits, 44,1 kHz réalisée avec DAW. Je joue l'accord de fa majeur. Cette source sonore est Il a une telle forme d'onde.
Faisons maintenant la transformation de Fourier. Je veux y aller, mais avant cela, je vais vous expliquer la "fonction fenêtre". Si le signal sonore est coupé tel qu'il est en secondes à secondes, un bruit qui ne devrait pas être là sera généré aux deux extrémités. Par conséquent, en multipliant les données entières par la fonction de fenêtre, le bruit peut être supprimé au prix d'une diminution de la précision de la décomposition de fréquence. Cette fois, j'utiliserai une fenêtre bourdonnante générale. La transformée de Fourier utilise la FFT (Fast Fourier Transform) de numpy. Comme il a été coupé pendant seulement 1 seconde, la taille des données est de 44100 et la décomposition de fréquence est également effectuée tous les 1 Hz.
#Fenêtre bourdonnante
h_win = np.hamming(data_size)
data_gt_h = data_gt * h_win
#Transformée de Fourier
data_size = sr_gt #La taille des données par seconde est égale à la fréquence d'échantillonnage
#Données FFT
fft_data_gt = np.fft.fft(data_gt) #Transformée de Fourier Rapide
amp_gt = np.abs(fft_data_gt/(data_size/2)) #Obtenez l'amplitude
amp_gt = amp_gt[:data_size//2] #Le résultat de FFT est un tableau de nombres complexes → seule la première moitié est un nombre réel
#Données de fréquence
freq = np.fft.fftfreq(data_size,d=1/data_size) #d est la période d'échantillonnage
freq = freq[:data_size//2] #Ajuster aux données FFT
Maintenant que nous avons une transformée de Fourier, traçons-la.
plt.plot(freq,amp_gt)
plt.axis([0,5000,0,3000])
plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude")
plt.show()
Alors ça devient comme ça. (Comme il était presque 0 après 10000 Hz, je l'ai coupé.)
Maintenant le sujet principal. Ajoutez chaque élément du résultat de la transformée de Fourier. L'autre source sonore a également été créée à partir de la source sonore de base de la DAW. Le BPM (tempo) est le même que la source sonore de la guitare en 8 minutes de fa (fa). La méthode FFT est la même que pour la source sonore de guitare. La transformée de Fourier de la source sonore de basse est illustrée ci-dessous (3000 Hz est coupé pour la même raison que la source sonore de guitare).
Maintenant, synthétisons.
fft_data_ba = np.fft.fft(data_ba) #Source sonore basse FFT
amp_ba = np.abs(fft_data_ba/(data_size/2))[:data_size//2] #Même taille de données que la guitare
#Synthétique
amp_mix = amp_gt + amp_ba #Ajout pour chaque élément
#terrain
plt.plot(freq,amp_mix)
plt.axis([0,10000,0,8000])
plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude")
plt.show()
Ensuite, la figure ci-dessous est obtenue.
Le haut est une source sonore composite de deux sources sonores et le bas est un composite de chaque transformée de Fourier. Dans les deux cas, les données sont ajoutées et synthétisées telles quelles sans ajuster la balance telle que le volume. Bien qu'il existe des valeurs maximales et de petites différences, on peut dire que les contours sont presque les mêmes. D'après ce qui précède, il a été constaté que si les fréquences contenues dans chaque source sonore et leurs rapports sont connus, la distribution de fréquence de la source sonore synthétisée peut être connue sans synthétiser les sources sonores.
En conclusion, c'était naturel, mais cela semble utile lors du changement de bande de fréquence de la guitare ou de la basse pour faire ségréguer les sons. Ensuite, j'étudierai la cause de la partie légèrement différente entre la transformation de Fourier de la source sonore synthétisée et la synthèse de la transformée de Fourier. C'est peut-être un problème de phase. c'est tout.
Recommended Posts