Как сделать оконный полосовой фильтр?

Здравствуйте.

Есть какой-то сложный сигнал. В нем есть очень много частот (от 0 до 100, например), это можно получить с помощью преобразования Фурье. Но требуется оставить только определенные частоты (например, от 10 до 50) и вывести сигнал обратно только уже с этими определенными частотами.

Пытался сделать преобразование Фурье, обнуление ненужных частот, обратное преобразование Фурье, но получилось что-то не то.

Недавно узнал про оконный полосовой фильтр. Не знаете, как сделать его на Python?

Спасибо)
  • Вопрос задан
  • 1364 просмотра
Пригласить эксперта
Ответы на вопрос 3
longclaps
@longclaps
import numpy as np, matplotlib.pyplot as plt
from scipy.fftpack import rfft, irfft

n = 2 ** 8
x = np.linspace(0, 2 * np.pi, n)
y = np.sin(x) + np.cos(x * 30)
f0 = rfft(y)
f1 = f0.copy()
f1[:n // 8] = 0
z = irfft(f1)
f, (spectra, signal) = plt.subplots(2, 1, sharey=False)
spectra.plot(x, f0, label='f0')
spectra.plot(x, f1, label='f1')
spectra.legend()
spectra.title.set_text('spectra')
signal.plot(x, y, label='y')
signal.plot(x, z, label='z')
signal.legend()
signal.title.set_text('signal')
plt.legend()
plt.show()
Ответ написан
Papayaved
@Papayaved
FPGA, MCU
Оконные функции нужны, чтобы уменьшить боковые лепестки при Фурье преобразование. Боковые лепестки - это появление ложных гармоник в сигнале по причине ограниченного числа отсчетов. Идеальное Фурье преобразование делает по бесконечным пределам с бесконечно малым шагом, а ДПФ вносит свои специфические погрешности.

Зануление не нужных частот в спектре соответствует умножению на прямоугольную оконную функцию. Чтобы не было ложных гармоник в сигнале надо умножать спектр на оконную функцию более сложной формы (см. википедию), также уменьшает боковые лепестки увеличение количества отсчетов, т.е. увеличение количества точек добавлением нулей.

Есть еще другое понятие, оконное преобразование Фурье, это преобразование Фурье скользящим окном. Причем использование БПФ уже не рационально, считают обычное ДПФ, пересчитывая спектр по получению каждого нового отсчета.
Ответ написан
@polybook
Необязательно делать через Фурье-преобразование, можно убрать тренд (НЧ) + сделать скользящее усреднение (сглаживание ВЧ). Параметры НЧ- и ВЧ-фильтра можно контролировать, делая Фурье-преобразование до и после. Подробнее: comma.polybook.ru/1.7.3.pdf
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы