为什么我的离散傅立叶变换仅在第一个bin中给出频率?

时间:2018-07-08 17:39:34

标签: python discrete-mathematics dft

我一直在尝试实现DFT以处理数据流,以寻找1 kHz和10 kHz的峰值。我希望通过仅处理DFT的bin来做到这一点,从中将驻留1 kHz和10 kHz信号。

在尝试实现此功能的过程中,我首先尝试实现DFT的(粗俗的)版本,以及一个用于创建数据以供我测试DFT的小程序。

当我运行DFT时,我得到一个这样的图形(y轴上DFT的幅度,x上的频率): DFT of a 10 kHz signal

这采用了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()

先谢谢您! :)

0 个答案:

没有答案