我一直在尝试实现DFT以处理数据流,以寻找1 kHz和10 kHz的峰值。我希望通过仅处理DFT的bin来做到这一点,从中将驻留1 kHz和10 kHz信号。
在尝试实现此功能的过程中,我首先尝试实现DFT的(粗俗的)版本,以及一个用于创建数据以供我测试DFT的小程序。
当我运行DFT时,我得到一个这样的图形(y轴上DFT的幅度,x上的频率):
这采用了10 kHz信号的DFT(这是我在编写的用于测试信号的文件中创建的)。
我尝试更改DFT的采样率和大小,但结果保持不变。
我看着这个stack overflow post,但似乎并没有帮助。我本以为我的DFT可以在0或1以外的其他地方获得值。
以下是DFT的代码:
Fs = 100000 # sampling rate
N = 100000 # number of samples of fourier analysis
'''
X[k] = Re(X[k]) + Im(X[k]) = Sum(n=0 to N-1)(x[n]cos(k * n * 2 * pi / N)) - Sum(n=0 to N-1)(x[n]sin(k * n * 2 * pi / N))
'''
def single_freq_fourier(x, n, k):
ReX = x * math.cos(k * n * 2 * math.pi / Fs)
ImX = x * math.sin(k * n * 2 * math.pi / Fs)
return ReX - ImX
def get_fourier(file_name='output.txt'):
X = []
Ks= []
with open(file_name) as f:
for K in range(0, N):
n = 0
X_new = 0
for line in f:
line = line.split(',')
x = float(line[1].strip(r'\s'))
X_new += single_freq_fourier(x, n, 1000)
n += 1
Ks.append(K)
X.append(X_new)
plt.plot(Ks, X)
plt.show()
先谢谢您! :)