Окно Хэмминга, питон 2.7

Привет, у меня есть БПФ, который довольно шумно. Как применить к моему окну окно Хемминга, чтобы сделать его менее шумным. Посмотри на мой код:

plt.subplot(212)
plt.title('Fast Fourier Transform')
plt.ylabel('Power [a.u.]')
plt.xlabel('Frequency Hz')
fft1 = (Bx[51:-14])
fft2 = (By[1:-14])

for dataset in [fft1]:
    dataset = np.asarray(dataset)
    psd = np.abs(np.fft.fft(dataset))**2.5
    freq = np.fft.fftfreq(dataset.size, float(300)/dataset.size)
    plt.semilogy(freq[freq>0], psd[freq>0]/dataset.size**2, color='r')

for dataset2 in [fft2]:
    dataset2 = np.asarray(dataset2)
    psd2 = np.abs(np.fft.fft(dataset2))**2.5
    freq2 = np.fft.fftfreq(dataset2.size, float(300)/dataset2.size)
    plt.semilogy(freq2[freq2>0], psd2[freq2>0]/dataset2.size**2, color='b')

Что такое plt.show()

Что мне нужно это:

Я видел ( https://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.signal.hamming.html) и это ( https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.hamming.html), но до сих пор не знаю, как применить его к моему коду. Есть идеи? Как я уже сказал, вы видите на второй картинке, что мне нужно. Может быть, окно Blackman также подойдет для применения, но все еще не знает, как его добавить.

Применяя это:

freqs, psd = scipy.signal.welch(dataset, fs=300, window='hamming')

Дали мне то, что не похоже на мой желаемый график.

2 ответа

Решение

Кажется, что метод Уэлча был верным, поэтому я подумал над своим вопросом, и вот ответ на него.

   # Loop for FFT data
    for dataset in [fft1]:
        dataset = np.asarray(dataset)
        freqs, psd = welch(dataset, fs=266336/300, window='hamming', nperseg=8192)
        plt.semilogy(freqs, psd/dataset.size**2, color='r')

    for dataset2 in [fft2]:
        dataset2 = np.asarray(dataset2)
        freqs2, psd2 = welch(dataset2, fs=266336/300, window='hamming', nperseg=8192)
        plt.semilogy(freqs2, psd2/dataset2.size**2, color='b')

Похоже, вы пытаетесь оценить спектр мощности ваших сигналов. Если это так, вы можете использовать что-то вроде scipy.signal.welch функция, которая оценивает сглаженный спектр путем вычисления БПФ из перекрывающихся сегментов данных. Вы можете передать метод window ключевое слово-аргумент напрямую, например 'hamming' или же 'blackman',

РЕДАКТИРОВАТЬ:

Применяя это к вашим данным, вы сделаете что-то вроде этого:

freqs, psd = scipy.signal.welch(dataset, fs=300, window='hamming')

Это вернет частоты и мощность на этих частотах. Я предполагаю, что 300 - ваша частота дискретизации (из ваших вычислений freq в твоем вопросе).

Другие вопросы по тегам