DFT (home made)

import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

# -> Parámetros de la señal
fs   = 44100 # frecuencia de muestreo
ts   = 1/fs
amplitud = 32767  # Amplitud máxima (para 16-bit PCM)
# -> Parámetros de la señal

f0 = 330     # Frecuencia en Hz (Ejemplo: 440 Hz corresponde a la nota A4)
t0 = 1/f0


ti = 0.0*t0
tf = 10*t0
Nt = int((tf-ti)*fs)
t  = np.zeros(Nt+1)
st = np.zeros(Nt+1)

for it in range(Nt+1):
 t[it] = ti+it*ts
 st[it] = math.sin(2.0*math.pi*f0*t[it])
 
######### -> GENERA WAV
senal_int16 = np.int16(amplitud*st)
# Guardar el archivo WAV
write("aux.wav", fs, senal_int16)
print("Archivo WAV generado con éxito.")
######### -> GENERA WAV


Nf   = 100
fi   = 0.0*f0
ff   = 2.0*f0
df   = (ff-fi)/Nf
f    = np.zeros(Nf+1)
sfr  = np.zeros(Nf+1)
sfi  = np.zeros(Nf+1)
sf   = np.zeros(Nf+1)


for ic in range(Nf+1):
 f[ic] = fi+ic*df
 for it in range(Nt+1):
   sfr[ic] = sfr[ic] + math.cos(2.0*math.pi*f0*t[it])*math.cos(2.0*math.pi*f[ic]*t[it])
   sfi[ic] = sfi[ic] + math.cos(2.0*math.pi*f0*t[it])*math.sin(2.0*math.pi*f[ic]*t[it])

sf = np.sqrt(sfr**2+sfi**2)


# Graficar la señal original
plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.plot(t , st, 'k')
plt.title('Dominio del tiempo')
plt.xlabel('t(s)')
plt.ylabel('s(t)')
plt.grid()

# Graficar la magnitud de la transformada de Fourier
plt.subplot(1, 2, 2)
plt.plot(f/f0,sf, 'k')
plt.title('Dominio de la frecuencia')
plt.xlabel('f (f0)')
plt.ylabel('s(f)')
plt.grid()
plt.tight_layout()
plt.show()