Tôi đã viết một triển khai biến đổi phạm vi đơn giản và xem phương trình DFT trên wikipedia để tham khảo , khi tôi nhận thấy rằng tôi đang làm một cái gì đó khác biệt, và sau khi nghĩ về nó, cảm thấy rằng phiên bản wikipedia phải sai vì nghĩ rất đơn giản tín hiệu khi biến đổi phạm vi (với phương trình đó) sẽ trả về phổ không chính xác: Bởi vì phương trình chỉ bao bọc tín hiệu xung quanh mặt phẳng phức (do với ), bất kỳ tín hiệu nào là định kỳ số lần chẵn (trong khi bọc mặt phẳng phức) sẽ không có phổ như các đỉnh thông thường (trong khi đi vòng tròn đơn vị) sẽ xuất hiện trong một DFT sẽ triệt tiêu lẫn nhau (khi số chẵn của chúng xuất hiện).
Để kiểm tra điều này tôi đã viết một số mã tạo ra hình ảnh sau đây, dường như để xác nhận suy nghĩ của tôi.
"Thời gian sử dụng phương trình" sử dụng phương trình với vector về thời gian (vì vậy thời gian mà tại đó được lấy mẫu chẳng hạn). Nó có thể được tìm thấy trong các chức năng dưới đây.
ft
Phương trình wikipedia, được liên kết ở trên, được sao chép ở đây để tham khảo: Nó có thể được tìm thấy trong hàm .
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()
Rõ ràng là có vẻ như tôi không thể ngẫu nhiên tìm thấy một lỗi trên một trang wiki cấu hình cao như vậy. Nhưng tôi không thể thấy một sai lầm trong những gì tôi đã làm?