Цель моей функции - построить график сигнала перед понижением частоты и понижением частоты сигнала. Чтобы более четко показать разницу между ними, я добавил БПФ исходного сигнала и БПФ сигнала пониженной дискретизации
Изображение результата можно увидеть ниже. Во-первых, я подумал, что 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)
Вот мой код функции
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'.