Руслан Жук – Искра надежды 2 (страница 6)
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")