Я хочу, чтобы БПФ какой-то набор данных, используя Python (scipy), но это не работает - PullRequest
0 голосов
/ 30 марта 2020

Цель моей функции - построить график сигнала перед понижением частоты и понижением частоты сигнала. Чтобы более четко показать разницу между ними, я добавил БПФ исходного сигнала и БПФ сигнала пониженной дискретизации enter image description here

Изображение результата можно увидеть ниже. Во-первых, я подумал, что FFT не работает правильно. Поэтому я изменил набор данных, например

 t = np.arange(0, 3, 0.01)
 data = np.sin(2 * np.pi * 30 * t) + np.sin(2* np.pi * 9 * t) + np.sin(2 * np.pi * 40 * t) +     np.sin(2* np.pi * 6 * t)

enter image description here

Вот мой код функции

def drawPlot(t, data, foption='decimate'):
  destFreq = 20 # decimate from 100Hz to 20Hz
  b,a = sig.butter(7, destFreq, fs=100, btype='lowpass')
  filtered = sig.decimate(data, q=5, n=7, ftype=sig.dlti(b,a))

  plt.subplot(3,1,1)
  plt.plot(t, data, label='Original Signal')
  t_new = np.arange(t[0], t[-1], 1/destFreq)
  plt.plot(t_new, filtered, label='Filtered Signal')
  plt.xlabel('Time [sec]')
  plt.ylabel('Amplitude')

  plt.subplot(3,1,2)
  # The fft of the signal
  freq_data = fftpack.fft(data) / len(data)
  # and the power
  power = np.abs(freq_data)
  freqs = fftpack.fftfreq(len(data), d=1/fs)
  plt.plot(freqs, power )
  plt.ylabel("FFT Origninal Amp")
  plt.xlabel("Frequency [Hz]")
  # plt.xlim(0)


  plt.subplot(3,1,3)
  fft_data = fftpack.fft(filtered)
  fft_power = np.abs(fft_data)
  fft_freqs = fftpack.fftfreq(len(fft_power), 1/destFreq)
  plt.plot(fft_freqs, fft_power)
  plt.ylabel('Filter passed Amp')
  plt.xlabel('Frequency [Hz]')
  # plt.xlim(0)
  plt.show()

Наконец-то я оставит ссылку для скачивания о наборе данных (оканчивающемся на .npz), состоящем из 'time' и 'rawdata'.

...