реклама
Бургер менюБургер меню

Руслан Жук – Искра надежды 2 (страница 6)

18

let z_real_sq = self.z_real[0].wrapping_mul(self.z_real[0]);

let z_imag_sq = self.z_imag[0].wrapping_mul(self.z_imag[0]);

let new_real = z_real_sq.wrapping_sub(z_imag_sq).wrapping_add(self.c_real[0]);

let new_imag = (2u64).wrapping_mul(self.z_real[0]).wrapping_mul(self.z_imag[0]).wrapping_add(self.c_imag[0]);

self.z_real[0] = new_real;

self.z_imag[0] = new_imag;

(new_real, new_imag)

}

pub fn next_block(&mut self) -> [u8; 64] {

let mut block = [0u8; 64];

for i in 0..32 {

let (r, im) = self.next();

block[i*2] = (r & 0xFF) as u8;

block[i*2 + 1] = (im & 0xFF) as u8;

}

block

}

}

```

6.3. Скрипт для автоматической калибровки

```python

#!/usr/bin/env python3

# calibrate_photonic_core.py

import time

import numpy as np

import matplotlib.pyplot as plt

from photonic_core import PhotonicCore, ModulationParams

def sweep_frequency(core, start_freq=1e6, end_freq=10e9, points=100):

"""Сканирование частоты модуляции для поиска оптимальной"""

freqs = np.logspace(np.log10(start_freq), np.log10(end_freq), points)

gains = []

params = ModulationParams()

params.c_real = [0x12345678, 0, 0, 0]

params.c_imag = [0x87654321, 0, 0, 0]

params.amplitude = 32768 # 50%

for freq in freqs:

params.frequency = int(freq)

core.set_modulation(params)

time.sleep(0.1) # ждём стабилизации

gain = core.get_gain()

gains.append(gain)

print(f"f = {freq:.2e} Гц, gain = {gain} dB")

return freqs, gains

def find_optimal(freqs, gains):

"""Поиск частоты с максимальным усилением"""

idx = np.argmax(gains)

return freqs[idx], gains[idx]

def plot_response(freqs, gains, optimal_freq, optimal_gain):

"""Построение графика АЧХ"""

plt.figure(figsize=(10, 6))

plt.semilogx(freqs, gains, 'b-', linewidth=2)

plt.plot(optimal_freq, optimal_gain, 'ro', markersize=10, label=f'Optimum: {optimal_freq:.2e} Гц')

plt.xlabel('Frequency (Hz)')

plt.ylabel('Gain (dB)')

plt.title('Frequency Response of Photonic Amplifier')

plt.grid(True, which='both', alpha=0.3)

plt.legend()

plt.savefig('frequency_response.png')

plt.show()

if __name__ == "__main__":

core = PhotonicCore.open()

print("Starting frequency sweep...")

freqs, gains = sweep_frequency(core)

opt_freq, opt_gain = find_optimal(freqs, gains)

print(f"\nOptimal frequency: {opt_freq:.2e} Hz")