私は簡単なフーリエ変換の実装を書いていて、参考のためにウィキペディアのDFT方程式を見て、私が何か違うことをしていることに気づき、それについて考えた後、ウィキペディアのバージョンは間違っているに違いないと感じました。 (その方程式で)フーリエ変換すると誤ったスペクトルが返されることを通知します。 と )、(複素平面を包み込みながら)偶数回周期的な信号は、DFT中に表示される通常のピーク(単位円を回っている間)が互いに打ち消し合うため、スペクトルがありません(偶数の場合)それらの数が表示されます)。
これを確認するために、次の画像を生成するコードをいくつか作成しました。
「方程式を使用する時間」は方程式を使用します
ft
以下の関数で見つけることができます。
上でリンクされたウィキペディアの方程式は、参照用にここにコピーされます。
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()
明らかに、このような注目度の高いWikiページでランダムにエラーを見つけた可能性はかなり低いようです。しかし、私は自分がしたことの間違いを見ることができませんか?