Скачиваний:
4
Добавлен:
04.02.2020
Размер:
3.81 Кб
Скачать
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d
from scipy.special import jn_zeros
from scipy.constants import c

# исходные данные
R = 0.01
Eps = 5.7
freq = 15e9
dt_1 = 0.666e-9
dt_2 = 2e-9
dt_3 = 0.0666e-9
P = 0.4


def step_function(x):
    if x <= 0:
        return 0
    else:
        return 1


def sin_x(x):
    if x == 0:
        return 1
    else:
        return np.sin(x) / x


def spectrum(f):
    return sin_x((f - freq) * np.pi * dt_1) * dt_1


def signal(t, z):
    sum = 0
    for f in freq_array:
        if norm_freq[0] < f < norm_freq[-1]:
            sum += spectrum(f) * 1e9 * np.cos(f * 2 * np.pi * t - (f * 2 * np.pi * z) / (c * interp_omega(f)))
    return sum


count = 5  # количество корней
roots = jn_zeros(0, count)

# поиск частот для фазовых скоростей
omegas = [2 * np.pi * (5 + i / 5) * 1e9 for i in range(1, 200)]
speed = []
group_speed = []

# расчёт фазовых и групповых скоростей
for index in range(count):
    speed_array = [1 / (np.sqrt(Eps - (c * roots[index] / (R * omega)) ** 2)) for omega in omegas]
    group_speed_array = [(omegas[i + 1] - omegas[i]) / (omegas[i + 1] / speed_array[i + 1] - omegas[i] / speed_array[i])
                         for i in range(len(speed_array) - 1)]
    speed += [speed_array]
    group_speed += [group_speed_array]

# нахождение импульса
N = 2 ** 10
time_moments = [dt_2 * i / (N - 1) for i in range(N)]
impulse_array = [np.sin(2 * freq * np.pi * t) * (step_function(t - dt_1) - step_function(t)) for t in time_moments]

# вычисляем преобразование Фурье
N1 = 60
freq_array = [k / dt_2 for k in range(N1)]
spectr_points = [abs(spectrum(f)) for f in freq_array]
spectr_points = np.array(spectr_points) / max(spectr_points)
norm_freq = np.array(omegas) / (2 * np.pi)

# иследование сигнала со времнем
N = 1000
z = 0

time_1 = [4 * dt_2 * i / (N - 1) for i in range(N)]
interp_omega = interp1d(norm_freq, speed[0], kind='cubic')
signal_from_time = [signal(t - dt_1 / 2, 100) for t in time_1]

# сигнал после некоторой дистанции
num = 0
distance = [num + i / N for i in range(N)]
signal_from_dist = [signal(num + dt_1 / 2, d) for d in distance]
res = 0
res_x = 0
for i in range(len(signal_from_dist) - 1):
    if signal_from_dist[i] < P < signal_from_dist[i + 1]:
        res = distance[i]
        res_x = i
        #break
print("Дистанция равна:", res_x * dt_1/2 * c )

plt.figure(1, figsize=(8, 15))
plt.grid(True)

plt.subplot(5, 1, 1)
plt.title('Фазовые и групповые скорости')
max = 1 / np.sqrt(Eps)
plt.ylim(0, 1)
plt.plot([omegas[0], omegas[-1]], [max, max], linestyle='--', color='black')
for index in range(count):
    plt.plot(omegas, speed[index], color='blue', linewidth=0.8)
    plt.plot(omegas[0:-1], group_speed[index], color='red', linewidth=0.8)

plt.subplot(5, 1, 2)
plt.title("Импульс")
plt.plot(time_moments, impulse_array, color="red")

plt.subplot(5, 1, 3)
plt.title('Спектр')
for f, val in zip(freq_array, spectr_points):
    plt.plot([f, f], [0, val], color='blue', linewidth=0.5)
plt.plot(freq_array, spectr_points, color='red')
plt.plot([norm_freq[0], norm_freq[0]], [0, 1], color='black', linestyle='--', linewidth=0.8)

plt.subplot(5, 1, 4)
plt.title("Сигнал с течением времени")
plt.plot(time_1, signal_from_time, color='red')

plt.subplot(5, 1, 5)
plt.title("Сигнал после прохождения дистанции")
plt.plot(distance, signal_from_dist, color='red')
plt.plot([distance[0], distance[-1]], [P, P], color='blue', linestyle='--', linewidth=0.8)

plt.savefig("im.png")
plt.show()
Соседние файлы в папке lab5