Выводы.
В ходе выполнения практической работы были получены формулы для передаточных функций нерекурсивных фильтров, соответствующих сглаживанию полиномами 1, 2, 4 степеней и сглаживанию по формуле Спенсера для разного количества точек приближения.
По полученным формулам были построены и проанализированы графики передаточной функции Данные графики также были построены в логарифмической шкале, что позволило более точно рассмотреть малейшие колебания передаточных функций.
Также был проведён сопоставительный анализ передаточных функций исследуемых фильтров.
Приложение а исходный код
import math
import cmath
import matplotlib.pyplot as plt
from math import cos, log10
# Прямая линия
# 3 точки
def H_1_3(w):
return (1 + 2*cos(w)) / 3
# 5 точек
def H_1_5(w):
return (1 + 2*cos(w) + 2*cos(2*w)) / 5
# 7 точек
def H_1_7(w):
return (1 + 2*cos(w) + 2*cos(2*w) + 2*cos(3*w)) / 7
# 9 точек
def H_1_9(w):
return (1 + 2*cos(w) + 2*cos(2*w) + 2*cos(3*w) + 2*cos(4*w)) / 9
# Полином 2ой степени
# 7 точек
def H_2_7(w):
return (7 + 12*cos(w) + 6*cos(2*w) - 4*cos(3*w)) / 21
# 9 точек
def H_2_9(w):
return (
59 + 108*cos(w) + 78*cos(2*w) +
28*cos(3*w) - 42*cos(4*w)
) / 231
# 11 точек
def H_2_11(w):
return (
89 + 168*cos(w) + 138*cos(2*w) +
88*cos(3*w) + 18*cos(4*w) - 72*cos(5*w)
) / 429
# 13 точек
def H_2_13(w):
return (
25 + 48*cos(w) + 42*cos(2*w) +
32*cos(3*w) + 18*cos(4*w)
- 22*cos(6*w)
) / 143
# Полином 4ой степени
# 9 точек
def H_4_9(w):
return (
179 + 270*cos(w) + 60*cos(2*w) -
110*cos(3*w) + 30*cos(4*w)
) / 429
# 11 точек
def H_4_11(w):
return (
143 + 240*cos(w) + 120*cos(2*w) -
20*cos(3*w) - 90*cos(4*w) + 36*cos(5*w)
) / 429
# 13 точек
def H_4_13(w):
return (
677 + 1200*cos(w) + 780*cos(2*w) +
220*cos(3*w) - 270*cos(4*w)
- 396*cos(5*w) + 220*cos(6*w)
) / 2431
# 15 точек
def H_4_15(w):
return (
11063 + 20250*cos(w) + 15000*cos(2*w) +
7510*cos(3*w) - 330*cos(4*w)
- 5874*cos(5*w) - 5720*cos(6*w) + 4290*cos(7*w)
) / 46189
# Формула спенсера
# 15 точек
def H_S_15(w):
return (
74 + 134*cos(w) + 92*cos(2*w) + 42*cos(3*w)
+ 6*cos(4*w) - 10*cos(5*w) - 12*cos(6*w) - 6*cos(7*w)
) / 320
# 21 точка
def H_S_21(w):
return (
60 + 114*cos(w) + 94*cos(2*w) + 66*cos(3*w)
+ 36*cos(4*w) + 12*cos(5*w) - 4*cos(6*w)
- 10*cos(7*w) - 10*cos(8*w) - 6*cos(9*w)
- 2*cos(10*w)
) / 350
# Прямая линия логарифмическая
# 3 точки
def Log_H_1_3(w):
return 20 * log10(abs(H_1_3(w)))
# 5 точек
def Log_H_1_5(w):
return 20 * log10(abs(H_1_5(w)))
# 7 точек
def Log_H_1_7(w):
return 20 * log10(abs(H_1_7(w)))
# 9 точек
def Log_H_1_9(w):
return 20 * log10(abs(H_1_9(w)))
# Полином 2ой степени логарифмический
# 7 точек
def Log_H_2_7(w):
return 20 * log10(abs(H_2_7(w)))
# 9 точек
def Log_H_2_9(w):
return 20 * log10(abs(H_2_9(w)))
# 11 точек
def Log_H_2_11(w):
return 20 * log10(abs(H_2_11(w)))
# 13 точек
def Log_H_2_13(w):
return 20 * log10(abs(H_2_13(w)))
# Полином 4ой степени логарифмический
# 9 точек
def Log_H_4_9(w):
return 20 * log10(abs(H_4_9(w)))
# 11 точек
def Log_H_4_11(w):
return 20 * log10(abs(H_4_11(w)))
# 13 точек
def Log_H_4_13(w):
return 20 * log10(abs(H_4_13(w)))
# 15 точек
def Log_H_4_15(w):
return 20 * log10(abs(H_4_15(w)))
# Формула спенсера логарифмическая
# 15 точек
def Log_H_S_15(w):
return 20 * log10(abs(H_S_15(w)))
# 21 точка
def Log_H_S_21(w):
return 20 * log10(abs(H_S_21(w)))
# Количество частот гармоник
N = 2048
# Циклические частоты
F = [f/N for f in range(N)][:N//2]
# Круговые частоты
W = [2*math.pi * f for f in F ]
# Приближение прямой линией
h_1_3 = [H_1_3(w) for w in W]
h_1_5 = [H_1_5(w) for w in W]
h_1_7 = [H_1_7(w) for w in W]
h_1_9 = [H_1_9(w) for w in W]
plt.plot(F, h_1_3, label='3 точки')
plt.plot(F, h_1_5, label='5 точек')
plt.plot(F, h_1_7, label='7 точек')
plt.plot(F, h_1_9, label='9 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!
# Приближение полиномом второй степени
h_2_7 = [H_2_7(w) for w in W]
h_2_9 = [H_2_9(w) for w in W]
h_2_11 = [H_2_11(w) for w in W]
h_2_13 = [H_2_13(w) for w in W]
plt.plot(F, h_2_7, label='7 точек')
plt.plot(F, h_2_9, label='9 точек')
plt.plot(F, h_2_11, label='11 точек')
plt.plot(F, h_2_13, label='13 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!
# Приближение полиномом четвертой степени
h_4_9 = [H_4_9(w) for w in W]
h_4_11 = [H_4_11(w) for w in W]
h_4_13 = [H_4_13(w) for w in W]
h_4_15 = [H_4_15(w) for w in W]
plt.plot(F, h_4_9, label='9 точек')
plt.plot(F, h_4_11, label='11 точек')
plt.plot(F, h_4_13, label='13 точек')
plt.plot(F, h_4_15, label='15 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!
# Приближение по формуле Спенсера
h_S_15 = [H_S_15(w) for w in W]
h_S_21 = [H_S_21(w) for w in W]
plt.plot(F, h_S_15, label='15 точек')
plt.plot(F, h_S_21, label='21 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!
# Приближение прямой линией
plt.figure(figsize=(20,5))
log_h_1_3 = [Log_H_1_3(w) for w in W]
log_h_1_5 = [Log_H_1_5(w) for w in W]
log_h_1_7 = [Log_H_1_7(w) for w in W]
log_h_1_9 = [Log_H_1_9(w) for w in W]
plt.plot(F, log_h_1_3, label='3 точки')
plt.plot(F, log_h_1_5, label='5 точек')
plt.plot(F, log_h_1_7, label='7 точек')
plt.plot(F, log_h_1_9, label='9 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!
# Приближение полиномом второй степени
plt.figure(figsize=(20,5))
log_h_2_7 = [Log_H_2_7(w) for w in W]
log_h_2_9 = [Log_H_2_9(w) for w in W]
log_h_2_11 = [Log_H_2_11(w) for w in W]
log_h_2_13 = [Log_H_2_13(w) for w in W]
plt.plot(F, log_h_2_7, label='7 точек')
plt.plot(F, log_h_2_9, label='9 точек')
plt.plot(F, log_h_2_11, label='11 точек')
plt.plot(F, log_h_2_13, label='13 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!
# Приближение полиномом четвёртой степени
plt.figure(figsize=(20,5))
log_h_4_9 = [Log_H_4_9(w) for w in W]
log_h_4_11 = [Log_H_4_11(w) for w in W]
log_h_4_13 = [Log_H_4_13(w) for w in W]
log_h_4_15 = [Log_H_4_15(w) for w in W]
plt.plot(F, log_h_4_9, label='9 точек')
plt.plot(F, log_h_4_11, label='11 точек')
plt.plot(F, log_h_4_13, label='13 точек')
plt.plot(F, log_h_4_15, label='15 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!
# Приближение по формуле Спенсера
plt.figure(figsize=(20,5))
log_h_S_15 = [Log_H_S_15(w) for w in W]
log_h_S_21 = [Log_H_S_21(w) for w in W]
plt.plot(F, log_h_S_15, label='15 точек')
plt.plot(F, log_h_S_21, label='21 точек')
plt.xlabel('f')
plt.ylabel('$\widetilde{H}(f)$')
plt.legend()
plt.show()
!