-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasson.py
More file actions
122 lines (97 loc) · 3.89 KB
/
Copy pathbasson.py
File metadata and controls
122 lines (97 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import numpy as np
import matplotlib.pyplot as plt
import math
import soundfile as sf
import wave
import struct
from accessory import *
from basson_accessory import *
data, fe = sf.read("note_basson_plus_sinus_1000_hz.wav")
tracer_forme_onde(y=data, titre="Forme du fichier audio original")
X = np.fft.fft(data)
frequences = np.fft.fftfreq(len(data),d=1/fe)
plt.plot(frequences, 20 * np.log10(np.abs(X)))
plt.xlim(0,1500)
plt.title("Spectres de fourier avant filtrage")
plt.xlabel("fréquence (Hz)")
plt.ylabel("Amplitude (dB)")
plt.show()
f_0 = 1000
f_1 = 40
w_0 = 2 * np.pi * f_0 / fe
w_1 = 2 * np.pi * f_1 / fe
N = 6000
n = np.linspace(-(N / 2) + 1, N / 2, N)
m = math.ceil(f_1 * N / fe)
K = 2 * m + 1
index = np.linspace(-(N / 2) + 1, (N / 2), N)
filtre_coupe_bande = [coupe_bande(n, N, K, w_0) for n in index]
tracer_forme_onde(y=filtre_coupe_bande, titre="Filtre coupe-bande)")
bidon = np.fft.fft(filtre_coupe_bande)
bidonfreq = np.fft.fftfreq(len(filtre_coupe_bande),d=1/fe)
plt.plot(bidonfreq, 20 * np.log10(np.abs(bidon)))
plt.show()
window = np.hanning(N)
filtre_coupe_bande_fenetre = filtre_coupe_bande * window
tracer_forme_onde(y=filtre_coupe_bande_fenetre, titre="Filtre coupe-bande fenêtré")
audio = np.convolve(filtre_coupe_bande_fenetre, data)
tracer_forme_onde(y=audio, titre="Forme du fichier audio filtré")
X = np.fft.fft(audio)
frequences = np.fft.fftfreq(len(audio),d=1/fe)
plt.plot(frequences, 20 * np.log10(np.abs(X)))
plt.xlim(0,1500)
plt.title("Spectres de fourier après filtrage")
plt.xlabel("fréquence (Hz)")
plt.ylabel("Amplitude (dB)")
plt.show()
creer_wav_audio(audio, fe, "basson_filtre.wav")
data = audio
# Signal temporel fenêtré
fenetre = np.hanning(len(data))
data_fenetre = np.multiply(data, fenetre)
data_fenetre = np.divide(data_fenetre, np.max(data_fenetre)) # Normalisation
tracer_forme_onde(y=data_fenetre, titre="Forme du fichier audio fenêtré")
# Signal fréquentiel (FFT)
# Passer dans le domaine fréquentiel permet de trouver l'ordre du filtre passe-bas
w = np.pi / 1000
Nb_sinusoides = 32
# Trouver l'ordre du filtre passe-bas
N_passe_bas = trouver_ordre_filtre_passe_bas(w=w)
# Enveloppe du signal initial
coeff = np.ones(N_passe_bas) / N_passe_bas
enveloppe = np.convolve(coeff, np.abs(data), mode="same")
enveloppe = np.divide(enveloppe, np.max(enveloppe))
tracer_forme_onde(y=enveloppe, titre="Enveloppe du signal initial")
X = np.fft.fft(data_fenetre)
frequences = np.fft.fftfreq(len(data_fenetre),d=1/fe)
index_lad = np.argmax(abs(X))
fondamentale = frequences[index_lad]
index_harmoniques = [index_lad * i for i in range(0, Nb_sinusoides + 1)]
freq_harmoniques = [frequences[i] for i in index_harmoniques]
harmoniques = [np.abs(X[i]) for i in index_harmoniques]
phases = [np.angle(X[i]) for i in index_harmoniques]
# Création du fichier audio à partir des harmoniques
note_audio = creer_audio(harmoniques, phases, fondamentale, fe, enveloppe, 2)
tracer_forme_onde(y=note_audio, titre="Forme du fichier audio synthétisé")
X = np.fft.fft(note_audio)
frequences = np.fft.fftfreq(len(note_audio),d=1/fe)
tracer_forme_onde(x= frequences,y=20 * np.log10(np.abs(X)), titre="Spectre de fréquence du basson synthétisé",db=True)
creer_wav_audio(note_audio, fe, "basson_synth.wav")
fig, ax = plt.subplots()
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
ax.axis("tight")
cellText = []
for i in range(len(harmoniques)):
cellText.append([freq_harmoniques[i], 20*np.log10(harmoniques[i]), phases[i]])
table = ax.table(cellText = cellText, colLabels = ["Fréquence (Hz)", "Amplitude", "Phase"], loc="center")
table.auto_set_font_size(False)
table.set_fontsize(10)
table.scale(1, 0.5)
plt.show()
# Pour le rapport:
plot_spectrum(data, fe, title="Spectre d'amplitude - Basson avant filtrage")
creer_wav_audio(audio, fe, "basson_filtre.wav")
# Signal avant filtrage (basson original)
# Signal après filtrage
plot_spectrum(audio, fe, title="Spectre d'amplitude - Basson après filtrage")