Estaba escribiendo una implementación simple de transformación de Fourier y miré la ecuación DFT en Wikipedia como referencia , cuando me di cuenta de que estaba haciendo algo diferente, y después de pensarlo, sentí que la versión de Wikipedia debe estar equivocada porque es muy simple pensar en un señal que cuando Fourier transformado (con esa ecuación) devolverá un espectro incorrecto: porque la ecuación envuelve la señal alrededor del plano complejo solo una vez (debido a con ), cualquier señal que sea periódica un número par de veces (mientras se envuelve el plano complejo) no tendrá espectro, ya que los picos habituales (al girar alrededor del círculo unitario) que aparecerían durante un DFT se cancelarán entre sí (cuando un algunos de ellos aparecen).
Para verificar esto, escribí un código que produjo la siguiente imagen, que parece confirmar lo que pienso.
"Tiempo usando ecuación" usa la ecuación
ft
continuación.
La ecuación de Wikipedia, vinculada anteriormente, se copia aquí como referencia:
ft2
.
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')
def ft(t, s, fs):
freq_step = fs / len(s)
freqs = np.arange(0, fs/2 + freq_step, freq_step)
S = []
for freq in freqs:
real = np.sum(s * np.cos(2*np.pi*freq * t))
compl = np.sum(- s * np.sin(2*np.pi*freq * t))
tmpsum = (real**2 + compl**2) ** 0.5
S.append(tmpsum)
return S, freqs
def ft2(s, fs): # Using wikipedia equation
nump=len(s)
freq_step = fs / nump
freqs = np.arange(0, fs/2 + freq_step, freq_step)
S = []
for i, freq in enumerate(freqs):
real = np.sum(s * np.cos(2*np.pi*freq * i/nump))
compl = np.sum(- s * np.sin(2*np.pi*freq * i/nump))
tmpsum = (real**2 + compl**2) ** 0.5
S.append(tmpsum)
return S, freqs
def main():
f = 5
fs = 100
t = np.linspace(0, 2, 200)
y = np.sin(2*np.pi*f*t) + np.cos(2*np.pi*f*2*t)
fig = plt.figure()
ax = fig.add_subplot(311)
ax.set_title('Signal in time domain')
ax.set_xlabel('t')
ax.plot(t, y)
S, freqs = ft(t, y, fs)
ax = fig.add_subplot(312)
ax.set_xticks(np.arange(0, freqs[-1], 2))
ax.set_title('Time using equation')
ax.set_xlabel('frequency')
ax.plot(freqs, S)
S, freqs = ft2(y, fs)
ax = fig.add_subplot(313)
ax.set_title('Using Wiki equation')
ax.set_xlabel('frequency')
ax.set_xticks(np.arange(0, freqs[-1], 2))
ax.plot(freqs, S)
plt.tight_layout()
plt.show()
main()
Obviamente, parece bastante improbable que haya encontrado un error al azar en una página wiki de tan alto perfil. ¿Pero no puedo ver un error en lo que he hecho?