Stavo scrivendo una semplice implementazione di trasformata di Fourier e ho guardato l' equazione DFT su Wikipedia per riferimento , quando ho notato che stavo facendo qualcosa di diverso, e dopo averci pensato ho sentito che la versione di Wikipedia deve essere sbagliata perché è molto semplice pensare a un segnala che quando Fourier trasformato (con quell'equazione) restituirà uno spettro errato: Poiché l'equazione avvolge il segnale attorno al piano complesso solo una volta (a causa di con ), qualsiasi segnale periodico un numero pari di volte (mentre si avvolge il piano complesso) non avrà spettro come i picchi abituali (mentre si gira intorno al cerchio unitario) che apparirebbero durante un DFT si annulleranno a vicenda (quando appare un numero pari di essi).
Per verificare questo ho scritto un codice che ha prodotto la seguente immagine, che sembra confermare ciò che i miei pensieri.
"Tempo che usa l'equazione" usa l'equazione con un vettore of time (quindi l'ora in cui stato campionato ad esempio). Si trova nella funzione seguente.
ft
L'equazione di Wikipedia, collegata sopra, viene copiata qui come riferimento: Può essere trovato nella funzione .
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()
Ovviamente sembra piuttosto improbabile che avrei trovato casualmente un errore su una pagina wiki di così alto profilo. Ma non riesco a vedere un errore in quello che ho fatto?