Частота полосы пропускания в питоне? - PullRequest
0 голосов
/ 04 марта 2019

Я хотел бы отфильтровать нежелательные частоты и сохранить сигнал только 60 Гц.

Вот что я сделал до сих пор:

import numpy as np
from scipy.fftpack import rfft, irfft, fftfreq
#
time   = np.linspace(0,1,1000)

in_sig = np.cos(54*np.pi*time) + np.cos(60*np.pi*time)  + np.sin(66*np.pi*time);
high_freq = 62;
low_freq = 58;

freqs = fftfreq(len(in_sig), d=time[1]-time[0])
filt_sig = rfft(in_sig)

cut_filt_sig = filt_sig.copy()
cut_filt_sig[(freqs<low_freq)] = 0
cut_filt_sig[(freqs>high_freq)] = 0

cut_in_sig = irfft(cut_filt_sig)

from pylab import *
figure(figsize=(10, 6))
subplot(221);plot(time,in_sig); title('Input signal');
subplot(222);plot(freqs,filt_sig);xlim(0,100);title('FFT of the input signal');

subplot(223);plot(time,cut_in_sig); title('Filtered signal');
xlabel('Time (s)')
subplot(224);plot(freqs,cut_filt_sig);xlim(0,100); title('FFT of the filtered signal');
xlabel('Freq. (Hz)')

show()

График результатов

Как я вижу, фильтрованный сигнал имеет меньшие амплитуды по краям, я предполагаю, что это может быть связано с применением прямоугольного окна.Какие окна вы бы порекомендовали использовать для улучшения вывода?

1 Ответ

0 голосов
/ 05 марта 2019

Проблема, скорее всего, связана с тем, что numpy's linspace().Режим по умолчанию включает конечную точку stop.Так что time это 0, 1/999, 2/999, ..., 1.Напротив, fft обрабатывает сигнал длиной N как периодический сигнал, дискретизированный при 0, T/N, ... , T(N-1)/N, таким образом избегая избыточности конечной точки.Поэтому в вычисленном DFT используется кадр длины T = 1000/999.Следовательно, частоты ДПФ равны k * 999/1000, а не k.Поскольку длина кадра не кратна периоду сигнала (1/6 с), возникает проблема, называемая спектральная утечка .

Чтобы избежать спектральной утечки, длинакадр можно сократить до кратного периода, удалив конечную точку:

time   = np.linspace(0,1,1000,endpoint=False)

Возвращает time как 0, 1/1000, .... 999/1000, обработано DFTкак кадр длины 1, который кратен периоду входного сигнала (1/6 с).

withoutspectralleakage

Если длинакадр не кратен периоду сигнала, входной сигнал может быть оконным , чтобы частично смягчить эффект, связанный с разрывом на краю кадра, но импульсные частоты все еще существуют.Наконец, фактические частоты могут быть надлежащим образом вычислены путем оценки частоты пика в качестве его средней частоты с учетом плотности мощности.См. Мой ответ на Почему значения частоты округляются в сигнале с использованием БПФ?

...