Приложение а исходный код
import math
import cmath
import matplotlib.pyplot as plt
import random
import numpy as np
n = 11
N = 32
dw = math.pi * 0.1
T = 1
# Генерация коэффициентов косинусоид
def generate():
w = [dw * i for i in range(n)]
A = list(range(1, n + 1))
random.shuffle(A)
phi = [random.uniform(0, 0.5) for _ in range(n)]
return w, A, phi
w, A, phi = generate()
print(f'''
w = {w}
A = {A}
phi = {phi}
''')
# Сгенерированные коэффициенты
w = [0.0, 0.3141592653589793, 0.6283185307179586, 0.9424777960769379, 1.2566370614359172, 1.5707963267948966, 1.8849555921538759, 2.199114857512855, 2.5132741228718345, 2.827433388230814, 3.141592653589793]
A = [2, 1, 8, 5, 10, 7, 6, 11, 3, 9, 4]
phi = [0.33785569669357485, 0.23248647684059848, 0.3917624429955529, 0.057993767165982035, 0.4247444506665633, 0.454128256896334, 0.3996500754750942, 0.22441622269575007, 0.0792848793029533, 0.10232991229754218, 0.27385006680932694]
# Сигнал
def s(t):
return sum([A[i] * math.cos(w[i]*t + phi[i]) for i in range(n)])
# Дискретные отсчёты
Xn = list(range(N))
# Отсчёты для графика аналогового сигнала
X = [i * N / (2**12) for i in range(2**12)]
S = [s(x) for x in Xn]
# Аналоговый сигнал
plt.plot(X, [s(x) for x in X], color='royalblue')
plt.xlabel('t')
plt.ylabel('s(t)')
plt.grid()
plt.show()
!
# Дискретизированный сигнал
plt.plot(Xn, S, 'o--', color='crimson')
plt.xlabel('n')
plt.ylabel('s(n)')
plt.grid()
plt.show()
!
# Преобразование фурье для исходного сигнала
W = np.fft.fftfreq(N, d=T)[:N // 2] * 2 * np.pi
F = np.fft.fft(S, norm='forward')[:N // 2] * 2
# Спектр исходного сигнала
plt.plot(W, [abs(f) for f in F], 'o--', color='royalblue')
plt.xlabel('$\omega$')
plt.ylabel('|A|')
plt.grid()
plt.show()
!
# Линейное сглаживание по 5 точкам
def L_5(S):
y = []
for i in range(2, N - 2):
y.append((S[i-2] + S[i-1] + S[i] + S[i+1] + S[i+2]) / 5)
return ([0] * 2) + y + ([0] * 2)
# Линейное сглаживание по 9 точкам
def L_9(S):
y = []
for i in range(4, N - 4):
y.append((S[i-4] + S[i-3] + S[i-2] + S[i-1] + S[i] + S[i+1] + S[i+2] + S[i+3] + S[i+4]) / 9)
return ([0] * 4) + y + ([0] * 4)
Y_L_5 = L_5(S)
Y_L_9 = L_9(S)
# Сглаженный сигнал (линейно 5 точек)
plt.plot(Xn, S, 'o--', color='crimson', label='Исходный сигнал')
plt.plot(Xn, Y_L_5, 'o--', color='royalblue', label='Сглаженный (линейно, 5 точек)')
plt.xlabel('n')
plt.ylabel('s(n)')
plt.grid()
plt.legend()
plt.show()
!
# Сглаженный сигнал (линейно 9 точек)
plt.plot(Xn, S, 'o--', color='crimson', label='Исходный сигнал')
plt.plot(Xn, Y_L_9, 'o--', color='royalblue', label='Сглаженный (линейно, 9 точек)')
plt.xlabel('n')
plt.ylabel('s(n)')
plt.grid()
plt.legend()
plt.show()
!
# Преобразование фурье для сглаженного сигнала (линейное)
F_L_5 = np.fft.fft(Y_L_5, norm='forward')[:N // 2] * 2
F_L_9 = np.fft.fft(Y_L_9, norm='forward')[:N // 2] * 2
# Спектр сглаженного сигнала (линейный 5 точек)
plt.plot(W, [abs(f) for f in F], 'o--', color='royalblue', label='Спектр исходного сигнала')
plt.plot(W, [abs(f) for f in F_L_5], 'o--', color='hotpink', label='Спектр сглаженного сигнала (линейно, 5 точек)')
plt.xlabel('$\omega$')
plt.ylabel('|A|')
plt.grid()
plt.legend()
plt.show()
!
# Спектр сглаженного сигнала (линейный 9 точек)
plt.plot(W, [abs(f) for f in F], 'o--', color='royalblue', label='Спектр исходного сигнала')
plt.plot(W, [abs(f) for f in F_L_9], 'o--', color='hotpink', label='Спектр сглаженного сигнала (линейно, 9 точек)')
plt.xlabel('$\omega$')
plt.ylabel('|A|')
plt.grid()
plt.legend()
plt.show()
!
# Сглаживание второй степени по 5 точкам
def S_5(S):
y = []
for i in range(2, N - 2):
y.append((-3*S[i-2] + 12*S[i-1] + 17*S[i] + 12*S[i+1] - 3*S[i+2]) / 35)
return ([0] * 2) + y + ([0] * 2)
# Сглаживание второй степени по 9 точкам
def S_9(S):
y = []
for i in range(4, N - 4):
y.append((
-21*S[i-4] + 14*S[i-3] + 39*S[i-2] + 54*S[i-1] + 59*S[i] +
54*S[i+1] + 39*S[i+2] + 14*S[i+3] - 21*S[i+4]
) / 231)
return ([0] * 4) + y + ([0] * 4)
Y_S_5 = S_5(S)
Y_S_9 = S_9(S)
# Сглаженный сигнал (второй степени 5 точек)
plt.plot(Xn, S, 'o--', color='crimson', label='Исходный сигнал')
plt.plot(Xn, Y_S_5, 'o--', color='royalblue', label='Сглаженный (второй степени, 5 точек)')
plt.xlabel('n')
plt.ylabel('s(n)')
plt.grid()
plt.legend()
plt.show()
!
# Сглаженный сигнал (второй степени 9 точек)
plt.plot(Xn, S, 'o--', color='crimson', label='Исходный сигнал')
plt.plot(Xn, Y_S_9, 'o--', color='royalblue', label='Сглаженный (второй степени, 9 точек)')
plt.xlabel('n')
plt.ylabel('s(n)')
plt.grid()
plt.legend()
plt.show()
!
# Преобразование фурье для сглаженного сигнала (второй степени)
F_S_5 = np.fft.fft(Y_S_5, norm='forward')[:N // 2] * 2
F_S_9 = np.fft.fft(Y_S_9, norm='forward')[:N // 2] * 2
# Спектр сглаженного сигнала (второй степени 5 точек)
plt.plot(W, [abs(f) for f in F], 'o--', color='royalblue', label='Спектр исходного сигнала')
plt.plot(W, [abs(f) for f in F_S_5], 'o--', color='hotpink', label='Спектр сглаженного сигнала (второй степени, 5 точек)')
plt.xlabel('$\omega$')
plt.ylabel('|A|')
plt.grid()
plt.legend()
plt.show()
!
# Спектр сглаженного сигнала (второй степени 9 точек)
plt.plot(W, [abs(f) for f in F], 'o--', color='royalblue', label='Спектр исходного сигнала')
plt.plot(W, [abs(f) for f in F_S_9], 'o--', color='hotpink', label='Спектр сглаженного сигнала (второй степени, 9 точек)')
plt.xlabel('$\omega$')
plt.ylabel('|A|')
plt.grid()
plt.legend()
plt.show()
!
# Сглаживание четвёртой степени по 7 точкам
def Q_7(S):
y = []
for i in range(3, N - 3):
y.append((
5*S[i-3] - 30*S[i-2] + 75*S[i-1] + 131*S[i]
+ 75*S[i+1] - 30*S[i+2] + 5*S[i+3]
) / 231)
return ([0] * 3) + y + ([0] * 3)
# Сглаживание четвёртой степени по 11 точкам
def Q_11(S):
y = []
for i in range(5, N - 5):
y.append((
18*S[i-5] - 45*S[i-4] - 10*S[i-3] + 60*S[i-2] + 120*S[i-1] + 143*S[i] +
120*S[i+1] + 60*S[i+2] - 10*S[i+3] - 45*S[i+4] + 18*S[i+5]
) / 429)
return ([0] * 5) + y + ([0] * 5)
Y_Q_7 = Q_7(S)
Y_Q_11 = Q_11(S)
# Сглаженный сигнал (четвёртой степени 7 точек)
plt.plot(Xn, S, 'o--', color='crimson', label='Исходный сигнал')
plt.plot(Xn, Y_Q_7, 'o--', color='royalblue', label='Сглаженный (четвёртой степени, 7 точек)')
plt.xlabel('n')
plt.ylabel('s(n)')
plt.grid()
plt.legend()
plt.show()
!
# Сглаженный сигнал (четвёртой степени 11 точек)
plt.plot(Xn, S, 'o--', color='crimson', label='Исходный сигнал')
plt.plot(Xn, Y_Q_11, 'o--', color='royalblue', label='Сглаженный (четвёртой степени, 11 точек)')
plt.xlabel('n')
plt.ylabel('s(n)')
plt.grid()
plt.legend()
plt.show()
!
# Преобразование фурье для сглаженного сигнала (четвёртой степени)
F_Q_7 = np.fft.fft(Y_Q_7, norm='forward')[:N // 2] * 2
F_Q_11 = np.fft.fft(Y_Q_11, norm='forward')[:N // 2] * 2
# Спектр сглаженного сигнала (четвёртой степени 7 точек)
plt.plot(W, [abs(f) for f in F], 'o--', color='royalblue', label='Спектр исходного сигнала')
plt.plot(W, [abs(f) for f in F_Q_7], 'o--', color='hotpink', label='Спектр сглаженного сигнала (чевёртой степени, 7 точек)')
plt.xlabel('$\omega$')
plt.ylabel('|A|')
plt.grid()
plt.legend()
plt.show()
!
# Спектр сглаженного сигнала (четвёртой степени 11 точек)
plt.plot(W, [abs(f) for f in F], 'o--', color='royalblue', label='Спектр исходного сигнала')
plt.plot(W, [abs(f) for f in F_Q_11], 'o--', color='hotpink', label='Спектр сглаженного сигнала (чевёртой степени, 11 точек)')
plt.xlabel('$\omega$')
plt.ylabel('|A|')
plt.grid()
plt.legend()
plt.show()
!