[PYTHON] Comparons la transformée de Fourier de la source sonore synthétisée et le composite de la transformée de Fourier

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.

que vas-tu faire

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.

Qu'est-ce que la transformée de Fourier?

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».

Méthode de transformation de Fourier

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 gtr-f-wave.png 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é.) disgtr-f.png

Synthétiser le résultat de la transformation de Fourier

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). bass-f.png

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. mix-f.png

Comparaison

mix-f-pre.png mix-f-plus.png 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.

finalement

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

Comparons la transformée de Fourier de la source sonore synthétisée et le composite de la transformée de Fourier
Propriétés de la transformée de Fourier discrète
Comparez la vitesse d'ajout et de carte Python
Comparons les deux images et recherchons les erreurs
Comment confirmer le théorème de Persival en utilisant matplotlib et la transformée de Fourier de Scipy (FFT)
[Introduction au son] Organisons l'introduction au son de python et de R ♬ -Écoutez le son de l'explosion de Nikkei 255-
Traversons le mur du système de coordonnées gauche et du système de coordonnées droitier.
Prédisons le timing de Barus et apprécions le film lentement
Comparez les polices de jupyter-themes
Transformée de Fourier des données brutes
Installation source et installation de Python
L'histoire de Python et l'histoire de NaN
Décidons le gagnant du bingo
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
Procédure d'apprentissage automatique de base: ③ Comparez et examinez la méthode de sélection de la quantité de caractéristiques