如何在脉冲信号上使用Numpy.FFT

时间:2019-02-13 22:31:31

标签: python numpy fft

我才刚刚开始学习numpy.fft,因此提前致歉。 我有一个包含1000个1和0的元素组成的数组,表示1000ms包含正误的脉冲输入。我想在此数组上执行rfft。举一个简单的例子,我创建了这个数组,该数组在每个第3个元素上都有一个1,否则为0:

freq = 3
for j in range(0, 1000):
    if freq != 0 and (((j + 1) % freq) == 0):
        arr3hz.append(1)
    else:
        arr3hz.append(0)

我期望rfft以某种方式给我3Hz,我使用了以下代码:

n = len(arr3hz)
d = 1 / 1000
hs = np.fft.rfft(arr3hz)
fs = np.fft.rfftfreq(n, d)
amps = np.absolute(hs)

for j in range(0, len(fs)):
    fw.write("Freq: %d Amp: %f\n" % (fs[j], amps[j]))

在我的书面文件中,我仅看到随机幅度的随机频率元素,这是我无法理解的。我使用numpy.rfft有什么问题?我也不确定如何将nd用于此类数组。

1 个答案:

答案 0 :(得分:3)

这里发生了一些事情。

  1. 第一个块的期间为3毫秒,即333.33 Hz的频率
  2. 平均值不为零,因此频率分量也为零。
  3. 1000毫秒不能被3毫秒整除。离散傅立叶变换假定整个信号以等于窗口长度(1000 ms)的周期重复。这意味着您有332个3 ms的间隔和1个4 ms的间隔。由于在333 Hz频率下不是周期性的,因此会有频率扩展。

您为nd使用了正确的值。
通常,我发现绘制输出图形比打印输出值更有用。

import matplotlib.pyplot as plt
plt.plot(fs, amps)

请参见

pulse_freq_plot