Jam

// Home.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include "stdafx.h"
#include "string.h"
#include "memory.h"
#include "stdlib.h"


bool findcharexised(char *str,char c)
{
size_t len = strlen(str);
for (size_t i=0;i<len;i++)
{
if (c == *(str+i))
{
return true;
}
}
return false;
}




char findtheminchar(char *SourceStr,char Inchar)
{
char outchar = '\0';
size_t len = strlen(SourceStr);
size_t i =0;
for (;i<len;i++)
{
if (*(SourceStr+i) == Inchar )
{
break;
}


}
if (len-1 == i)
{
//end
return '#';

else
{
return *(SourceStr+i+1);
}
}


bool findbigger(char *str,char inputchar,char* outputchar,char *beginstr)
{
bool findflag = false;
int len = strlen(str);
for (int i=0;i<len;i++)
{
char temp = *(str+i);
if (( temp> inputchar) && (!findcharexised(beginstr,temp)))
{
           *outputchar = *(str+i);
  *(outputchar+1) = '\0';
  findflag = true;
  break;
}
}
return findflag;
}




char *GetNextNum(char* str1)
{
char str[] = "bcdefghij";
int n = strlen(str1);
    int i = n-1;
char findout = '\0';
for (;i>=0;i--)
{
char tempkk = '\0';
//char *outputchar = '\;
char kkk = *(str1+i);
if (findbigger(str,*(str1+i),&tempkk,str1))
{
//*(str1+i) = outputchar;
findout = tempkk;
break;
}
else
{


}
}
//
char *newnum = new char[n+1];
memset(newnum,0,sizeof(char)*(n+1));
if (-1 == i)
{
//no num fit
free(newnum);
}
else
{
//new num

for (int j=0;j<i;j++)
{
newnum[j] = *(str1+j);
}
//newnum[]
newnum[i] = findout;
for (int j=i+1;j<n;j++)
{
//newnum[j] = *(str)
//findout++;
char temoppp = findtheminchar(str,findout);
findout = temoppp;
if ('#' != temoppp)
{
 //strcat(newnum,&temoppp);
newnum[j] = temoppp;
}
}
}


return NULL;
}








int GetBit(int n)
{
int bitcount = 1;
while(n >10)

       bitcount++;
  n = n/10;
}
return bitcount;
}
/*
char *GetStr(int m,int n)
{
char str[100] = {'\0'};
int strcount = 0;
for (int i=m;i<=n;i++)
{
int newcharnum = GetBit(i);
char *tempstr = new char[newcharnum];
sprintf(tempstr,"%d",i);
if (n == i)
{
    strcat(tempstr,";");

else
{
            strcat(tempstr,"+");
}


strcat(str,tempstr);
        
        //str[strcount] = 
int kkk =0;
}
return str;
}


*/
int _tmain(int argc, _TCHAR* argv[])
{
   


   //char str[100] = {'\0'};
   //char *strindex = GetStr(11,19);
   //strcpy(str,strindex);
char str[] = "bdfij";
    GetNextNum(str);
return 0;
}

#参照这个程序设计一个GPS对抗程序,并给出全部代码 import sys import numpy as np from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QGroupBox, QLabel, QSlider, QComboBox, QPushButton, QDoubleSpinBox, QCheckBox, QFrame) from PyQt5.QtCore import Qt, QTimer from PyQt5.QtGui import QFont, QPalette, QColor import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure # 添加中文字体支持 plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun', 'Arial Unicode MS'] # 设置中文字体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # ... 其余代码保持不变 ... class CommunicationSystem: def __init__(self): self.signal_freq = 100 # MHz self.signal_amplitude = 1.0 self.modulation_type = "FM" # FM, AM or PM self.modulation_index = 0.5 self.snr = 20 # dB self.noise_amplitude = 0.1 # 干扰参数 self.jamming_type = "None" # None, Noise, Sweep, Pulse, Tone self.jamming_amplitude = 0.5 self.jamming_freq = 110 # MHz self.jamming_sweep_start = 90 # MHz self.jamming_sweep_end = 110 # MHz self.jamming_sweep_rate = 0.5 # MHz/ms # 系统参数 self.sample_rate = 1000 # 采样率 (MS/s) self.duration = 1 # 信号持续时间 (ms) def generate_signal(self): """生成通信信号""" t = np.linspace(0, self.duration, int(self.sample_rate * self.duration)) carrier = np.sin(2 * np.pi * self.signal_freq * t) # 调制信号 if self.modulation_type == "FM": modulating_signal = np.sin(2 * np.pi * 1 * t) # 1 kHz调制信号 signal = np.sin(2 * np.pi * self.signal_freq * t + self.modulation_index * modulating_signal) elif self.modulation_type == "AM": modulating_signal = 0.5 * np.sin(2 * np.pi * 1 * t) + 0.5 signal = self.signal_amplitude * carrier * modulating_signal else: # PM modulating_signal = np.sin(2 * np.pi * 1 * t) signal = np.sin(2 * np.pi * self.signal_freq * t + self.modulation_index * modulating_signal) return t, signal def generate_noise(self, signal): """生成噪声""" noise_power = self.noise_amplitude * np.random.normal(0, 1, len(signal)) return signal + noise_power def generate_jamming(self, t): """生成干扰信号""" if self.jamming_type == "None": return np.zeros_like(t) elif self.jamming_type == "Noise": return self.jamming_amplitude * np.random.normal(0, 1, len(t)) elif self.jamming_type == "Tone": return self.jamming_amplitude * np.sin(2 * np.pi * self.jamming_freq * t) elif self.jamming_type == "Sweep": freq_sweep = np.linspace(self.jamming_sweep_start, self.jamming_sweep_end, len(t)) return self.jamming_amplitude * np.sin(2 * np.pi * freq_sweep * t) elif self.jamming_type == "Pulse": jamming_signal = np.zeros_like(t) pulse_width = 0.1 # 脉冲宽度 (ms) pulse_start = 0.3 # 脉冲开始时间 (ms) pulse_end = pulse_start + pulse_width pulse_indices = np.where((t >= pulse_start) & (t <= pulse_end))[0] jamming_signal[pulse_indices] = self.jamming_amplitude * np.sin( 2 * np.pi * self.jamming_freq * t[pulse_indices]) return jamming_signal return np.zeros_like(t) def generate_combined_signal(self): """生成带干扰的通信信号""" t, signal = self.generate_signal() noisy_signal = self.generate_noise(signal) jamming_signal = self.generate_jamming(t) combined_signal = noisy_signal + jamming_signal return t, signal, noisy_signal, jamming_signal, combined_signal def calculate_spectrum(self, signal): """计算信号的频谱""" n = len(signal) spectrum = np.fft.fft(signal) freq = np.fft.fftfreq(n, d=1.0 / self.sample_rate) return freq[:n // 2], np.abs(spectrum[:n // 2]) def calculate_snr(self, signal, noise): """计算信噪比""" signal_power = np.sum(signal ** 2) noise_power = np.sum(noise ** 2) if noise_power == 0: return float('inf') snr = 10 * np.log10(signal_power / noise_power) return snr class DigitalDashboard(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("超短波通信对抗仿真系统") self.setGeometry(100, 50, 1400, 900) # 初始化通信系统 self.comm_system = CommunicationSystem() # 设置深色主题 self.set_dark_theme() # 创建主控件 self.main_widget = QWidget() self.setCentralWidget(self.main_widget) # 主布局 main_layout = QVBoxLayout(self.main_widget) main_layout.setSpacing(15) main_layout.setContentsMargins(20, 20, 20, 20) # 标题 title_label = QLabel("超短波通信对抗仿真系统") title_label.setFont(QFont("Arial", 24, QFont.Bold)) title_label.setStyleSheet("color: #1E90FF;") title_label.setAlignment(Qt.AlignCenter) main_layout.addWidget(title_label) # 创建控制面板 control_panel = self.create_control_panel() main_layout.addWidget(control_panel) # 创建波形显示区域 waveform_panel = self.create_waveform_panel() main_layout.addWidget(waveform_panel, 1) # 创建频谱显示区域 spectrum_panel = self.create_spectrum_panel() main_layout.addWidget(spectrum_panel, 1) # 创建状态显示 status_panel = self.create_status_panel() main_layout.addWidget(status_panel) # 初始化数据 self.update_simulation() # 设置定时器用于实时更新 self.timer = QTimer(self) self.timer.timeout.connect(self.update_simulation) self.timer.start(100) # 每100ms更新一次 def set_dark_theme(self): """设置深色主题""" dark_palette = QPalette() dark_palette.setColor(QPalette.Window, QColor(25, 35, 45)) dark_palette.setColor(QPalette.WindowText, Qt.white) dark_palette.setColor(QPalette.Base, QColor(35, 45, 55)) dark_palette.setColor(QPalette.AlternateBase, QColor(45, 55, 65)) dark_palette.setColor(QPalette.ToolTipBase, Qt.white) dark_palette.setColor(QPalette.ToolTipText, Qt.white) dark_palette.setColor(QPalette.Text, Qt.white) dark_palette.setColor(QPalette.Button, QColor(50, 65, 80)) dark_palette.setColor(QPalette.ButtonText, Qt.white) dark_palette.setColor(QPalette.BrightText, Qt.red) dark_palette.setColor(QPalette.Highlight, QColor(30, 144, 255)) dark_palette.setColor(QPalette.HighlightedText, Qt.black) self.setPalette(dark_palette) self.setStyleSheet(""" QGroupBox { font-size: 14px; font-weight: bold; border: 2px solid #1E90FF; border-radius: 8px; margin-top: 1ex; color: #1E90FF; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; padding: 0 5px; } QSlider::groove:horizontal { border: 1px solid #4A708B; height: 8px; background: #2F4F4F; margin: 2px 0; border-radius: 4px; } QSlider::handle:horizontal { background: #1E90FF; border: 1px solid #4A708B; width: 18px; margin: -4px 0; border-radius: 9px; } QPushButton { background-color: #1E90FF; color: white; border: none; border-radius: 4px; padding: 5px 10px; font-weight: bold; } QPushButton:hover { background-color: #00BFFF; } QLabel { color: white; } """) def create_control_panel(self): """创建控制面板""" panel = QGroupBox("通信对抗控制面板") layout = QGridLayout() panel.setLayout(layout) # 通信参数控制 comm_label = QLabel("通信参数:") comm_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(comm_label, 0, 0) # 信号频率 freq_label = QLabel("信号频率 (MHz):") self.freq_spin = QDoubleSpinBox() self.freq_spin.setRange(30, 300) self.freq_spin.setValue(self.comm_system.signal_freq) self.freq_spin.setSingleStep(1) self.freq_spin.valueChanged.connect(self.update_freq) layout.addWidget(freq_label, 1, 0) layout.addWidget(self.freq_spin, 1, 1) # 信号幅度 amp_label = QLabel("信号幅度:") self.amp_slider = QSlider(Qt.Horizontal) self.amp_slider.setRange(0, 100) self.amp_slider.setValue(int(self.comm_system.signal_amplitude * 100)) self.amp_slider.valueChanged.connect(self.update_amp) layout.addWidget(amp_label, 2, 0) layout.addWidget(self.amp_slider, 2, 1) # 调制方式 mod_label = QLabel("调制方式:") self.mod_combo = QComboBox() self.mod_combo.addItems(["FM", "AM", "PM"]) self.mod_combo.setCurrentText(self.comm_system.modulation_type) self.mod_combo.currentTextChanged.connect(self.update_modulation) layout.addWidget(mod_label, 3, 0) layout.addWidget(self.mod_combo, 3, 1) # 调制指数 mod_idx_label = QLabel("调制指数:") self.mod_idx_slider = QSlider(Qt.Horizontal) self.mod_idx_slider.setRange(0, 100) self.mod_idx_slider.setValue(int(self.comm_system.modulation_index * 100)) self.mod_idx_slider.valueChanged.connect(self.update_mod_idx) layout.addWidget(mod_idx_label, 4, 0) layout.addWidget(self.mod_idx_slider, 4, 1) # 干扰参数控制 jam_label = QLabel("干扰参数:") jam_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(jam_label, 0, 2) # 干扰类型 jam_type_label = QLabel("干扰类型:") self.jam_type_combo = QComboBox() self.jam_type_combo.addItems(["None", "Noise", "Tone", "Sweep", "Pulse"]) self.jam_type_combo.setCurrentText(self.comm_system.jamming_type) self.jam_type_combo.currentTextChanged.connect(self.update_jam_type) layout.addWidget(jam_type_label, 1, 2) layout.addWidget(self.jam_type_combo, 1, 3) # 干扰幅度 jam_amp_label = QLabel("干扰幅度:") self.jam_amp_slider = QSlider(Qt.Horizontal) self.jam_amp_slider.setRange(0, 100) self.jam_amp_slider.setValue(int(self.comm_system.jamming_amplitude * 100)) self.jam_amp_slider.valueChanged.connect(self.update_jam_amp) layout.addWidget(jam_amp_label, 2, 2) layout.addWidget(self.jam_amp_slider, 2, 3) # 干扰频率 jam_freq_label = QLabel("干扰频率 (MHz):") self.jam_freq_spin = QDoubleSpinBox() self.jam_freq_spin.setRange(30, 300) self.jam_freq_spin.setValue(self.comm_system.jamming_freq) self.jam_freq_spin.setSingleStep(1) self.jam_freq_spin.valueChanged.connect(self.update_jam_freq) layout.addWidget(jam_freq_label, 3, 2) layout.addWidget(self.jam_freq_spin, 3, 3) # 扫频范围 sweep_start_label = QLabel("扫频起点 (MHz):") self.sweep_start_spin = QDoubleSpinBox() self.sweep_start_spin.setRange(30, 300) self.sweep_start_spin.setValue(self.comm_system.jamming_sweep_start) self.sweep_start_spin.setSingleStep(1) self.sweep_start_spin.valueChanged.connect(self.update_sweep_start) layout.addWidget(sweep_start_label, 4, 2) layout.addWidget(self.sweep_start_spin, 4, 3) sweep_end_label = QLabel("扫频终点 (MHz):") self.sweep_end_spin = QDoubleSpinBox() self.sweep_end_spin.setRange(30, 300) self.sweep_end_spin.setValue(self.comm_system.jamming_sweep_end) self.sweep_end_spin.setSingleStep(1) self.sweep_end_spin.valueChanged.connect(self.update_sweep_end) layout.addWidget(sweep_end_label, 5, 2) layout.addWidget(self.sweep_end_spin, 5, 3) # 系统参数 sys_label = QLabel("系统参数:") sys_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(sys_label, 0, 4) # 采样率 sample_rate_label = QLabel("采样率 (MS/s):") self.sample_rate_spin = QDoubleSpinBox() self.sample_rate_spin.setRange(100, 2000) self.sample_rate_spin.setValue(self.comm_system.sample_rate) self.sample_rate_spin.setSingleStep(100) self.sample_rate_spin.valueChanged.connect(self.update_sample_rate) layout.addWidget(sample_rate_label, 1, 4) layout.addWidget(self.sample_rate_spin, 1, 5) # 噪声幅度 noise_amp_label = QLabel("噪声幅度:") self.noise_amp_slider = QSlider(Qt.Horizontal) self.noise_amp_slider.setRange(0, 100) self.noise_amp_slider.setValue(int(self.comm_system.noise_amplitude * 100)) self.noise_amp_slider.valueChanged.connect(self.update_noise_amp) layout.addWidget(noise_amp_label, 2, 4) layout.addWidget(self.noise_amp_slider, 2, 5) # 控制按钮 self.reset_btn = QPushButton("重置参数") self.reset_btn.clicked.connect(self.reset_params) layout.addWidget(self.reset_btn, 6, 0, 1, 2) self.auto_jam_btn = QPushButton("自动干扰") self.auto_jam_btn.clicked.connect(self.toggle_auto_jam) layout.addWidget(self.auto_jam_btn, 6, 2, 1, 2) self.optimize_btn = QPushButton("优化通信") self.optimize_btn.clicked.connect(self.optimize_communication) layout.addWidget(self.optimize_btn, 6, 4, 1, 2) self.auto_jam_active = False return panel def create_waveform_panel(self): """创建波形显示面板""" panel = QGroupBox("通信波形与干扰波形") layout = QHBoxLayout() panel.setLayout(layout) # 原始信号波形图 self.signal_fig = Figure(figsize=(10, 4), dpi=100) self.signal_canvas = FigureCanvas(self.signal_fig) self.signal_ax = self.signal_fig.add_subplot(111) self.signal_ax.set_title("原始通信信号") self.signal_ax.set_xlabel("时间 (ms)") self.signal_ax.set_ylabel("幅度") self.signal_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.signal_canvas) # 干扰信号波形图 self.jamming_fig = Figure(figsize=(10, 4), dpi=100) self.jamming_canvas = FigureCanvas(self.jamming_fig) self.jamming_ax = self.jamming_fig.add_subplot(111) self.jamming_ax.set_title("干扰信号") self.jamming_ax.set_xlabel("时间 (ms)") self.jamming_ax.set_ylabel("幅度") self.jamming_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.jamming_canvas) # 合成信号波形图 self.combined_fig = Figure(figsize=(10, 4), dpi=100) self.combined_canvas = FigureCanvas(self.combined_fig) self.combined_ax = self.combined_fig.add_subplot(111) self.combined_ax.set_title("合成信号 (通信 + 干扰)") self.combined_ax.set_xlabel("时间 (ms)") self.combined_ax.set_ylabel("幅度") self.combined_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.combined_canvas) return panel def create_spectrum_panel(self): """创建频谱显示面板""" panel = QGroupBox("信号频谱分析") layout = QHBoxLayout() panel.setLayout(layout) # 原始信号频谱图 self.spectrum_fig = Figure(figsize=(10, 4), dpi=100) self.spectrum_canvas = FigureCanvas(self.spectrum_fig) self.spectrum_ax = self.spectrum_fig.add_subplot(111) self.spectrum_ax.set_title("信号频谱") self.spectrum_ax.set_xlabel("频率 (MHz)") self.spectrum_ax.set_ylabel("幅度") self.spectrum_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.spectrum_canvas) # 合成信号频谱图 self.combined_spectrum_fig = Figure(figsize=(10, 4), dpi=100) self.combined_spectrum_canvas = FigureCanvas(self.combined_spectrum_fig) self.combined_spectrum_ax = self.combined_spectrum_fig.add_subplot(111) self.combined_spectrum_ax.set_title("合成信号频谱") self.combined_spectrum_ax.set_xlabel("频率 (MHz)") self.combined_spectrum_ax.set_ylabel("幅度") self.combined_spectrum_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.combined_spectrum_canvas) return panel def create_status_panel(self): """创建状态显示面板""" panel = QFrame() panel.setFrameShape(QFrame.StyledPanel) layout = QHBoxLayout() panel.setLayout(layout) # 通信状态 comm_status = QGroupBox("通信状态") comm_layout = QVBoxLayout() comm_status.setLayout(comm_layout) self.comm_status_label = QLabel("通信质量: 良好") self.comm_status_label.setFont(QFont("Arial", 14)) self.comm_status_label.setStyleSheet("color: #00FF00;") comm_layout.addWidget(self.comm_status_label) self.snr_label = QLabel("信噪比(SNR): 20 dB") self.snr_label.setFont(QFont("Arial", 12)) comm_layout.addWidget(self.snr_label) self.ber_label = QLabel("误码率(BER): 0.001%") self.ber_label.setFont(QFont("Arial", 12)) comm_layout.addWidget(self.ber_label) layout.addWidget(comm_status) # 干扰状态 jam_status = QGroupBox("干扰状态") jam_layout = QVBoxLayout() jam_status.setLayout(jam_layout) self.jam_status_label = QLabel("干扰强度: 弱") self.jam_status_label.setFont(QFont("Arial", 14)) self.jam_status_label.setStyleSheet("color: #FFA500;") jam_layout.addWidget(self.jam_status_label) self.jam_power_label = QLabel("干扰功率: 0.5") self.jam_power_label.setFont(QFont("Arial", 12)) jam_layout.addWidget(self.jam_power_label) self.jam_effect_label = QLabel("干扰效果: 轻微") self.jam_effect_label.setFont(QFont("Arial", 12)) jam_layout.addWidget(self.jam_effect_label) layout.addWidget(jam_status) # 系统状态 sys_status = QGroupBox("系统状态") sys_layout = QVBoxLayout() sys_status.setLayout(sys_layout) self.sys_status_label = QLabel("系统运行: 正常") self.sys_status_label.setFont(QFont("Arial", 14)) self.sys_status_label.setStyleSheet("color: #00FF00;") sys_layout.addWidget(self.sys_status_label) self.sample_rate_status = QLabel("采样率: 1000 MS/s") self.sample_rate_status.setFont(QFont("Arial", 12)) sys_layout.addWidget(self.sample_rate_status) self.freq_range_status = QLabel("频率范围: 30-300 MHz") self.freq_range_status.setFont(QFont("Arial", 12)) sys_layout.addWidget(self.freq_range_status) layout.addWidget(sys_status) return panel def update_simulation(self): """更新仿真数据并刷新界面""" # 生成信号数据 t, signal, noisy_signal, jamming_signal, combined_signal = self.comm_system.generate_combined_signal() # 计算频谱 freq, spectrum = self.comm_system.calculate_spectrum(signal) _, combined_spectrum = self.comm_system.calculate_spectrum(combined_signal) # 计算信噪比 snr = self.comm_system.calculate_snr(signal, jamming_signal + (noisy_signal - signal)) # 更新波形图 self.update_waveform_plot(t, signal, jamming_signal, combined_signal) # 更新频谱图 self.update_spectrum_plot(freq, spectrum, combined_spectrum) # 更新状态显示 self.update_status(snr, combined_signal) # 自动干扰模式 if self.auto_jam_active: self.auto_jamming() def update_waveform_plot(self, t, signal, jamming_signal, combined_signal): """更新波形图""" # 原始信号 self.signal_ax.clear() self.signal_ax.plot(t, signal, 'b-', linewidth=1.5) self.signal_ax.set_title("原始通信信号") self.signal_ax.set_xlabel("时间 (ms)") self.signal_ax.set_ylabel("幅度") self.signal_ax.grid(True, linestyle='--', alpha=0.6) self.signal_ax.set_xlim(0, self.comm_system.duration) self.signal_ax.set_ylim(-2.5, 2.5) self.signal_canvas.draw() # 干扰信号 self.jamming_ax.clear() self.jamming_ax.plot(t, jamming_signal, 'r-', linewidth=1.5) self.jamming_ax.set_title("干扰信号") self.jamming_ax.set_xlabel("时间 (ms)") self.jamming_ax.set_ylabel("幅度") self.jamming_ax.grid(True, linestyle='--', alpha=0.6) self.jamming_ax.set_xlim(0, self.comm_system.duration) self.jamming_ax.set_ylim(-2.5, 2.5) self.jamming_canvas.draw() # 合成信号 self.combined_ax.clear() self.combined_ax.plot(t, combined_signal, 'g-', linewidth=1.5) self.combined_ax.set_title("合成信号 (通信 + 干扰)") self.combined_ax.set_xlabel("时间 (ms)") self.combined_ax.set_ylabel("幅度") self.combined_ax.grid(True, linestyle='--', alpha=0.6) self.combined_ax.set_xlim(0, self.comm_system.duration) self.combined_ax.set_ylim(-2.5, 2.5) self.combined_canvas.draw() def update_spectrum_plot(self, freq, spectrum, combined_spectrum): """更新频谱图""" # 原始信号频谱 self.spectrum_ax.clear() self.spectrum_ax.plot(freq, spectrum, 'b-', linewidth=1.5) self.spectrum_ax.set_title("信号频谱") self.spectrum_ax.set_xlabel("频率 (MHz)") self.spectrum_ax.set_ylabel("幅度") self.spectrum_ax.grid(True, linestyle='--', alpha=0.6) self.spectrum_ax.set_xlim(0, 300) self.spectrum_canvas.draw() # 合成信号频谱 self.combined_spectrum_ax.clear() self.combined_spectrum_ax.plot(freq, combined_spectrum, 'g-', linewidth=1.5) self.combined_spectrum_ax.set_title("合成信号频谱") self.combined_spectrum_ax.set_xlabel("频率 (MHz)") self.combined_spectrum_ax.set_ylabel("幅度") self.combined_spectrum_ax.grid(True, linestyle='--', alpha=0.6) self.combined_spectrum_ax.set_xlim(0, 300) self.combined_spectrum_canvas.draw() def update_status(self, snr, combined_signal): """更新状态显示""" # 更新SNR self.snr_label.setText(f"信噪比(SNR): {snr:.2f} dB") # 估算误码率 ber = max(0.0001, 1 / (1 + np.exp(0.5 * (snr - 10)))) self.ber_label.setText(f"误码率(BER): {ber * 100:.4f}%") # 通信质量评估 if snr > 15: self.comm_status_label.setText("通信质量: 优秀") self.comm_status_label.setStyleSheet("color: #00FF00;") elif snr > 10: self.comm_status_label.setText("通信质量: 良好") self.comm_status_label.setStyleSheet("color: #7CFC00;") elif snr > 5: self.comm_status_label.setText("通信质量: 一般") self.comm_status_label.setStyleSheet("color: #FFD700;") else: self.comm_status_label.setText("通信质量: 差") self.comm_status_label.setStyleSheet("color: #FF4500;") # 干扰状态 jam_power = np.sum(np.abs(self.comm_system.jamming_amplitude)) self.jam_power_label.setText(f"干扰功率: {jam_power:.2f}") if jam_power < 0.3: self.jam_status_label.setText("干扰强度: 弱") self.jam_status_label.setStyleSheet("color: #7CFC00;") elif jam_power < 0.7: self.jam_status_label.setText("干扰强度: 中") self.jam_status_label.setStyleSheet("color: #FFA500;") else: self.jam_status_label.setText("干扰强度: 强") self.jam_status_label.setStyleSheet("color: #FF4500;") # 干扰效果评估 if snr < 5: self.jam_effect_label.setText("干扰效果: 严重") elif snr < 10: self.jam_effect_label.setText("干扰效果: 显著") elif snr < 15: self.jam_effect_label.setText("干扰效果: 轻微") else: self.jam_effect_label.setText("干扰效果: 无") # 系统状态 self.sample_rate_status.setText(f"采样率: {self.comm_system.sample_rate} MS/s") def auto_jamming(self): """自动干扰模式""" # 随机改变干扰参数 if np.random.rand() < 0.1: self.jam_type_combo.setCurrentIndex(np.random.randint(1, 5)) if np.random.rand() < 0.2: new_freq = max(30, min(300, self.comm_system.jamming_freq + np.random.randint(-20, 20))) self.jam_freq_spin.setValue(new_freq) if np.random.rand() < 0.3: new_amp = max(0.1, min(1.0, self.comm_system.jamming_amplitude + np.random.uniform(-0.1, 0.1))) self.jam_amp_slider.setValue(int(new_amp * 100)) def toggle_auto_jam(self): """切换自动干扰模式""" self.auto_jam_active = not self.auto_jam_active if self.auto_jam_active: self.auto_jam_btn.setText("停止干扰") self.auto_jam_btn.setStyleSheet("background-color: #FF4500;") else: self.auto_jam_btn.setText("自动干扰") self.auto_jam_btn.setStyleSheet("") def optimize_communication(self): """优化通信参数""" # 简单优化策略:避开干扰频率 if self.comm_system.jamming_type != "None" and self.comm_system.jamming_freq > 0: # 尝试避开干扰频率 new_freq = self.comm_system.jamming_freq + 20 if new_freq > 300: new_freq = self.comm_system.jamming_freq - 20 self.freq_spin.setValue(new_freq) self.comm_status_label.setText("通信参数已优化") def reset_params(self): """重置参数到默认值""" self.comm_system = CommunicationSystem() self.freq_spin.setValue(self.comm_system.signal_freq) self.amp_slider.setValue(int(self.comm_system.signal_amplitude * 100)) self.mod_combo.setCurrentText(self.comm_system.modulation_type) self.mod_idx_slider.setValue(int(self.comm_system.modulation_index * 100)) self.jam_type_combo.setCurrentText(self.comm_system.jamming_type) self.jam_amp_slider.setValue(int(self.comm_system.jamming_amplitude * 100)) self.jam_freq_spin.setValue(self.comm_system.jamming_freq) self.sweep_start_spin.setValue(self.comm_system.jamming_sweep_start) self.sweep_end_spin.setValue(self.comm_system.jamming_sweep_end) self.sample_rate_spin.setValue(self.comm_system.sample_rate) self.noise_amp_slider.setValue(int(self.comm_system.noise_amplitude * 100)) self.auto_jam_active = False self.auto_jam_btn.setText("自动干扰") self.auto_jam_btn.setStyleSheet("") # 参数更新函数 def update_freq(self, value): self.comm_system.signal_freq = value def update_amp(self, value): self.comm_system.signal_amplitude = value / 100.0 def update_modulation(self, text): self.comm_system.modulation_type = text def update_mod_idx(self, value): self.comm_system.modulation_index = value / 100.0 def update_jam_type(self, text): self.comm_system.jamming_type = text def update_jam_amp(self, value): self.comm_system.jamming_amplitude = value / 100.0 def update_jam_freq(self, value): self.comm_system.jamming_freq = value def update_sweep_start(self, value): self.comm_system.jamming_sweep_start = value def update_sweep_end(self, value): self.comm_system.jamming_sweep_end = value def update_sample_rate(self, value): self.comm_system.sample_rate = value def update_noise_amp(self, value): self.comm_system.noise_amplitude = value / 100.0 if __name__ == "__main__": app = QApplication(sys.argv) window = DigitalDashboard() window.show() sys.exit(app.exec_())
最新发布
10-13
<think>好的,用户希望我根据提供的通信对抗程序设计一个GPS对抗程序,并给出全部代码。首先,我需要理解用户提供的代码的结构和功能。这个程序是一个超短波通信对抗仿真系统,使用了PyQt5构建图形界面,matplotlib进行信号显示,可以生成不同类型的通信信号和干扰信号,并实时显示波形和频谱。 接下来,用户的需求是将其转换为GPS对抗程序。GPS系统通常使用特定的频率和调制方式,比如L1频段的1575.42MHz,采用BPSK调制。因此,我需要调整代码中的信号生成部分,使其符合GPS的特性。同时,干扰类型也需要针对GPS信号设计,比如窄带干扰、脉冲干扰、欺骗干扰等。 首先,我需要修改CommunicationSystem类中的generate_signal方法,生成符合GPS的信号。可能需要调整载波频率到L1频段,并使用BPSK调制。此外,GPS信号通常包含导航数据,可能需要模拟伪随机码(如C/A码)的生成。 然后,干扰部分需要添加针对GPS的特定干扰类型,比如欺骗式干扰,这可能需要生成伪造的卫星信号来干扰接收机。同时,原有的干扰类型可能需要调整参数以适应GPS的高频段。 接下来是界面部分。原来的控制面板需要调整参数,比如频率范围可能需要更精确到GPS频段,调制方式改为BPSK。可能需要添加新的干扰类型选项,比如欺骗干扰,并为其添加对应的参数控制,如伪码相位偏移、虚假卫星数量等。 在状态显示部分,可能需要添加GPS特有的指标,比如定位精度(HDOP)、卫星数量、信号强度等。误码率计算可能需要根据GPS信号的特点进行调整。 另外,自动干扰和优化通信功能需要针对GPS信号设计策略。例如,自动干扰可能随机选择干扰类型和参数,而优化通信可能涉及调整接收机参数以避开干扰。 在代码实现过程中,需要注意高频信号的采样率设置,确保满足奈奎斯特采样定理,避免混叠。同时,生成GPS信号时需要考虑伪随机码的周期性和相位,这可能需要更复杂的信号生成算法。 可能遇到的问题包括:如何高效生成GPS信号的伪随机码,如何在实时仿真中处理高频信号的计算,以及如何准确模拟不同类型的GPS干扰效果。此外,界面中的参数调整可能需要更精细的控件,如双精度自旋框来设置小数频率值。 需要验证生成的信号是否符合GPS标准,干扰是否能有效影响信号接收,并确保仿真系统的实时性和稳定性。测试时可能需要对比无干扰和有干扰情况下的信号质量和定位精度变化。 最后,确保所有代码的兼容性,特别是使用matplotlib和PyQt5的集成,以及正确导入中文字体支持,避免中文显示问题。检查所有参数更新函数是否正确连接到界面控件,确保交互操作流畅。 总结来说,我需要逐步修改通信系统模型以适应GPS特性,调整用户界面参数,添加新的干扰类型,并更新状态显示指标,同时确保代码结构和原有功能的完整性。 </think>以下是基于提供的通信对抗程序设计的GPS对抗仿真程序完整代码: ```python import sys import numpy as np from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QGroupBox, QLabel, QSlider, QComboBox, QPushButton, QDoubleSpinBox, QCheckBox, QFrame) from PyQt5.QtCore import Qt, QTimer from PyQt5.QtGui import QFont, QPalette, QColor import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure # 添加中文字体支持 plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun', 'Arial Unicode MS'] # 设置中文字体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 class GPSSystem: def __init__(self): # GPS信号参数(L1频段) self.satellite_id = 1 # 卫星编号 self.carrier_freq = 1575.42 # L1频段中心频率(MHz) self.signal_power = -160 # dBW self.code_rate = 1.023 # C/A码速率(Mcps) self.data_rate = 50 # 导航数据速率(bps) self.modulation_type = "BPSK" # 调制方式 # 环境参数 self.iono_delay = 5 # 电离层延迟(ns) self.tropo_delay = 1.5 # 对流层延迟(ns) self.multipath = 0.5 # 多径效应幅度 # 干扰参数 self.jamming_type = "None" # None, Narrowband, Pulse, Spoofing, Swept self.jamming_power = -100 # dBW self.jamming_freq = 1575.42 # 干扰频率(MHz) self.spoofing_delay = 0.1 # 欺骗干扰延迟(ms) self.spoofing_count = 1 # 虚假卫星数量 # 系统参数 self.sample_rate = 100 # 采样率(MS/s) self.duration = 1 # 信号持续时间(ms) self.noise_power = -200 # 热噪声功率(dBW) # 卫星信息 self.satellite_pos = np.array([12000, 20000, 5000]) # 卫星位置(km) self.user_pos = np.array([0, 0, 0]) # 用户位置(km) def generate_gps_signal(self): """生成GPS信号""" t = np.linspace(0, self.duration, int(self.sample_rate * self.duration * 1e3)) # 计算传播时延 distance = np.linalg.norm(self.satellite_pos - self.user_pos) propagation_delay = distance / 3e5 # 光速(km/ms) # 生成C/A码(简化模拟) ca_code = np.random.choice([-1, 1], size=len(t)) # 生成导航数据 data_bits = np.random.choice([-1, 1], size=int(self.data_rate * self.duration * 1e-3)) data_signal = np.repeat(data_bits, len(t)//len(data_bits)) # 构建BPSK信号 if self.modulation_type == "BPSK": phase = 2 * np.pi * self.carrier_freq * t * 1e6 * 1e-3 # 转换为Hz和秒 signal = 10**(self.signal_power/20) * (ca_code * data_signal) * np.sin(phase) else: signal = np.zeros_like(t) return t, signal def generate_interference(self, t): """生成干扰信号""" if self.jamming_type == "None": return np.zeros_like(t) elif self.jamming_type == "Narrowband": # 窄带干扰 phase = 2 * np.pi * self.jamming_freq * t * 1e6 * 1e-3 return 10**(self.jamming_power/20) * np.sin(phase) elif self.jamming_type == "Pulse": # 脉冲干扰 pulse_width = 0.1 # 脉冲宽度(ms) pulse_start = np.random.uniform(0, self.duration - pulse_width) pulse = np.zeros_like(t) pulse[(t >= pulse_start) & (t <= pulse_start + pulse_width)] = 1 phase = 2 * np.pi * self.jamming_freq * t * 1e6 * 1e-3 return 10**(self.jamming_power/20) * pulse * np.sin(phase) elif self.jamming_type == "Swept": # 扫频干扰 sweep_rate = 10 # 扫频速率(MHz/ms) freq = self.jamming_freq + sweep_rate * t phase = 2 * np.pi * freq * t * 1e6 * 1e-3 return 10**(self.jamming_power/20) * np.sin(phase) elif self.jamming_type == "Spoofing": # 欺骗干扰 spoofing_signal = np.zeros_like(t) for i in range(self.spoofing_count): delay = self.spoofing_delay * (i+1) phase = 2 * np.pi * self.carrier_freq * (t - delay) * 1e6 * 1e-3 spoofing_signal += 10**((self.jamming_power-3)/20) * np.sin(phase) return spoofing_signal return np.zeros_like(t) def add_noise(self, signal): """添加热噪声""" noise_power_linear = 10**(self.noise_power/10) noise = np.random.normal(0, np.sqrt(noise_power_linear/2), len(signal)) * 1j noise += np.random.normal(0, np.sqrt(noise_power_linear/2), len(signal)) return signal + noise.real def add_multipath(self, signal): """添加多径效应""" if self.multipath > 0: delay_samples = int(0.1 * self.sample_rate * 1e3 * self.duration / 1000) multipath_signal = np.roll(signal, delay_samples) multipath_signal[:delay_samples] = 0 return signal + self.multipath * multipath_signal return signal def calculate_pseudorange(self, signal): """计算伪距""" # 简化的伪距计算 noise_signal = self.add_noise(signal) interference_signal = self.generate_interference(t) combined_signal = noise_signal + interference_signal # 简单的信号检测 correlation = np.abs(np.correlate(combined_signal, signal[:100], mode='valid')) peak_index = np.argmax(correlation) # 计算伪距 pseudorange = (peak_index / (self.sample_rate * 1e6)) * 3e8 / 1e3 # km pseudorange += self.iono_delay * 0.3 # 电离层修正 pseudorange += self.tropo_delay * 0.1 # 对流层修正 return pseudorange def calculate_position(self): """计算位置""" # 简单的多卫星位置计算 true_position = self.user_pos estimated_position = np.zeros(3) # 模拟多个卫星观测 for _ in range(4): # 至少需要4颗卫星 self.satellite_pos = np.random.uniform(10000, 20000, 3) pseudorange = self.calculate_pseudorange(self.generate_gps_signal()[1]) estimated_position += (self.satellite_pos - (pseudorange / np.linalg.norm(self.satellite_pos)) * (self.satellite_pos - true_position)) return estimated_position / 4 def calculate_dop(self): """计算几何精度因子""" # 简化的DOP计算 satellite_positions = np.random.uniform(10000, 20000, (8, 3)) geometry_matrix = np.zeros((8, 4)) for i, sat_pos in enumerate(satellite_positions): sat_dist = np.linalg.norm(sat_pos) geometry_matrix[i, :3] = sat_pos / sat_dist geometry_matrix[i, 3] = 1 try: q_matrix = np.linalg.inv(geometry_matrix.T @ geometry_matrix) pdop = np.sqrt(q_matrix[0,0] + q_matrix[1,1] + q_matrix[2,2]) hdop = np.sqrt(q_matrix[0,0] + q_matrix[1,1]) vdop = np.sqrt(q_matrix[2,2]) except np.linalg.LinAlgError: pdop, hdop, vdop = 99.9, 99.9, 99.9 return pdop, hdop, vdop class GPSJammingSimulator(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("GPS对抗仿真系统") self.setGeometry(100, 50, 1400, 900) # 初始化GPS系统 self.gps_system = GPSSystem() # 设置深色主题 self.set_dark_theme() # 创建主控件 self.main_widget = QWidget() self.setCentralWidget(self.main_widget) # 主布局 main_layout = QVBoxLayout(self.main_widget) main_layout.setSpacing(15) main_layout.setContentsMargins(20, 20, 20, 20) # 标题 title_label = QLabel("GPS对抗仿真系统") title_label.setFont(QFont("Arial", 24, QFont.Bold)) title_label.setStyleSheet("color: #1E90FF;") title_label.setAlignment(Qt.AlignCenter) main_layout.addWidget(title_label) # 创建控制面板 control_panel = self.create_control_panel() main_layout.addWidget(control_panel) # 创建信号显示区域 signal_panel = self.create_signal_panel() main_layout.addWidget(signal_panel, 1) # 创建位置显示区域 position_panel = self.create_position_panel() main_layout.addWidget(position_panel) # 创建状态显示区域 status_panel = self.create_status_panel() main_layout.addWidget(status_panel) # 初始化数据 self.update_simulation() # 设置定时器用于实时更新 self.timer = QTimer(self) self.timer.timeout.connect(self.update_simulation) self.timer.start(100) # 每100ms更新一次 def set_dark_theme(self): """设置深色主题""" dark_palette = QPalette() dark_palette.setColor(QPalette.Window, QColor(25, 35, 45)) dark_palette.setColor(QPalette.WindowText, Qt.white) dark_palette.setColor(QPalette.Base, QColor(35, 45, 55)) dark_palette.setColor(QPalette.AlternateBase, QColor(45, 55, 65)) dark_palette.setColor(QPalette.ToolTipBase, Qt.white) dark_palette.setColor(QPalette.ToolTipText, Qt.white) dark_palette.setColor(QPalette.Text, Qt.white) dark_palette.setColor(QPalette.Button, QColor(50, 65, 80)) dark_palette.setColor(QPalette.ButtonText, Qt.white) dark_palette.setColor(QPalette.BrightText, Qt.red) dark_palette.setColor(QPalette.Highlight, QColor(30, 144, 255)) dark_palette.setColor(QPalette.HighlightedText, Qt.black) self.setPalette(dark_palette) self.setStyleSheet(""" QGroupBox { font-size: 14px; font-weight: bold; border: 2px solid #1E90FF; border-radius: 8px; margin-top: 1ex; color: #1E90FF; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; padding: 0 5px; } QSlider::groove:horizontal { border: 1px solid #4A708B; height: 8px; background: #2F4F4F; margin: 2px 0; border-radius: 4px; } QSlider::handle:horizontal { background: #1E90FF; border: 1px solid #4A708B; width: 18px; margin: -4px 0; border-radius: 9px; } QPushButton { background-color: #1E90FF; color: white; border: none; border-radius: 4px; padding: 5px 10px; font-weight: bold; } QPushButton:hover { background-color: #00BFFF; } QLabel { color: white; } """) def create_control_panel(self): """创建控制面板""" panel = QGroupBox("GPS对抗控制面板") layout = QGridLayout() panel.setLayout(layout) # 卫星参数控制 satellite_label = QLabel("卫星参数:") satellite_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(satellite_label, 0, 0) # 卫星编号 sat_id_label = QLabel("卫星编号:") self.sat_id_spin = QSpinBox() self.sat_id_spin.setRange(1, 32) self.sat_id_spin.setValue(self.gps_system.satellite_id) self.sat_id_spin.valueChanged.connect(self.update_sat_id) layout.addWidget(sat_id_label, 1, 0) layout.addWidget(self.sat_id_spin, 1, 1) # 载波频率 freq_label = QLabel("载波频率 (MHz):") self.freq_spin = QDoubleSpinBox() self.freq_spin.setRange(1570, 1580) self.freq_spin.setValue(self.gps_system.carrier_freq) self.freq_spin.setSingleStep(0.01) self.freq_spin.valueChanged.connect(self.update_carrier_freq) layout.addWidget(freq_label, 2, 0) layout.addWidget(self.freq_spin, 2, 1) # 信号功率 power_label = QLabel("信号功率 (dBW):") self.power_slider = QSlider(Qt.Horizontal) self.power_slider.setRange(-170, -150) self.power_slider.setValue(int(self.gps_system.signal_power)) self.power_slider.valueChanged.connect(self.update_signal_power) layout.addWidget(power_label, 3, 0) layout.addWidget(self.power_slider, 3, 1) # 干扰参数控制 jam_label = QLabel("干扰参数:") jam_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(jam_label, 0, 2) # 干扰类型 jam_type_label = QLabel("干扰类型:") self.jam_type_combo = QComboBox() self.jam_type_combo.addItems(["None", "Narrowband", "Pulse", "Spoofing", "Swept"]) self.jam_type_combo.setCurrentText(self.gps_system.jamming_type) self.jam_type_combo.currentTextChanged.connect(self.update_jam_type) layout.addWidget(jam_type_label, 1, 2) layout.addWidget(self.jam_type_combo, 1, 3) # 干扰功率 jam_power_label = QLabel("干扰功率 (dBW):") self.jam_power_slider = QSlider(Qt.Horizontal) self.jam_power_slider.setRange(-150, -50) self.jam_power_slider.setValue(int(self.gps_system.jamming_power)) self.jam_power_slider.valueChanged.connect(self.update_jam_power) layout.addWidget(jam_power_label, 2, 2) layout.addWidget(self.jam_power_slider, 2, 3) # 干扰频率 jam_freq_label = QLabel("干扰频率 (MHz):") self.jam_freq_spin = QDoubleSpinBox() self.jam_freq_spin.setRange(1570, 1580) self.jam_freq_spin.setValue(self.gps_system.jamming_freq) self.jam_freq_spin.setSingleStep(0.01) self.jam_freq_spin.valueChanged.connect(self.update_jam_freq) layout.addWidget(jam_freq_label, 3, 2) layout.addWidget(self.jam_freq_spin, 3, 3) # 欺骗干扰参数 spoofing_label = QLabel("欺骗干扰参数:") spoofing_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(spoofing_label, 0, 4) # 欺骗延迟 spoofing_delay_label = QLabel("欺骗延迟 (ms):") self.spoofing_delay_spin = QDoubleSpinBox() self.spoofing_delay_spin.setRange(0.01, 1.0) self.spoofing_delay_spin.setValue(self.gps_system.spoofing_delay) self.spoofing_delay_spin.setSingleStep(0.01) self.spoofing_delay_spin.valueChanged.connect(self.update_spoofing_delay) layout.addWidget(spoofing_delay_label, 1, 4) layout.addWidget(self.spoofing_delay_spin, 1, 5) # 虚假卫星数量 spoofing_count_label = QLabel("虚假卫星数量:") self.spoofing_count_spin = QSpinBox() self.spoofing_count_spin.setRange(1, 5) self.spoofing_count_spin.setValue(self.gps_system.spoofing_count) self.spoofing_count_spin.valueChanged.connect(self.update_spoofing_count) layout.addWidget(spoofing_count_label, 2, 4) layout.addWidget(self.spoofing_count_spin, 2, 5) # 环境参数控制 env_label = QLabel("环境参数:") env_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(env_label, 5, 0) # 电离层延迟 iono_label = QLabel("电离层延迟 (ns):") self.iono_slider = QSlider(Qt.Horizontal) self.iono_slider.setRange(0, 20) self.iono_slider.setValue(int(self.gps_system.iono_delay)) self.iono_slider.valueChanged.connect(self.update_iono_delay) layout.addWidget(iono_label, 6, 0) layout.addWidget(self.iono_slider, 6, 1) # 多径效应 multipath_label = QLabel("多径效应幅度:") self.multipath_slider = QSlider(Qt.Horizontal) self.multipath_slider.setRange(0, 100) self.multipath_slider.setValue(int(self.gps_system.multipath * 100)) self.multipath_slider.valueChanged.connect(self.update_multipath) layout.addWidget(multipath_label, 7, 0) layout.addWidget(self.multipath_slider, 7, 1) # 系统参数 sys_label = QLabel("系统参数:") sys_label.setFont(QFont("Arial", 12, QFont.Bold)) layout.addWidget(sys_label, 5, 2) # 采样率 sample_rate_label = QLabel("采样率 (MS/s):") self.sample_rate_spin = QDoubleSpinBox() self.sample_rate_spin.setRange(50, 200) self.sample_rate_spin.setValue(self.gps_system.sample_rate) self.sample_rate_spin.setSingleStep(10) self.sample_rate_spin.valueChanged.connect(self.update_sample_rate) layout.addWidget(sample_rate_label, 6, 2) layout.addWidget(self.sample_rate_spin, 6, 3) # 噪声功率 noise_label = QLabel("热噪声功率 (dBW):") self.noise_slider = QSlider(Qt.Horizontal) self.noise_slider.setRange(-210, -150) self.noise_slider.setValue(int(self.gps_system.noise_power)) self.noise_slider.valueChanged.connect(self.update_noise_power) layout.addWidget(noise_label, 7, 2) layout.addWidget(self.noise_slider, 7, 3) # 控制按钮 self.reset_btn = QPushButton("重置参数") self.reset_btn.clicked.connect(self.reset_params) layout.addWidget(self.reset_btn, 8, 0, 1, 2) self.auto_jam_btn = QPushButton("自动干扰") self.auto_jam_btn.clicked.connect(self.toggle_auto_jam) layout.addWidget(self.auto_jam_btn, 8, 2, 1, 2) self.optimize_btn = QPushButton("优化定位") self.optimize_btn.clicked.connect(self.optimize_positioning) layout.addWidget(self.optimize_btn, 8, 4, 1, 2) self.auto_jam_active = False return panel def create_signal_panel(self): """创建信号显示面板""" panel = QGroupBox("GPS信号与干扰信号") layout = QHBoxLayout() panel.setLayout(layout) # 原始信号波形图 self.signal_fig = Figure(figsize=(10, 4), dpi=100) self.signal_canvas = FigureCanvas(self.signal_fig) self.signal_ax = self.signal_fig.add_subplot(111) self.signal_ax.set_title("原始GPS信号") self.signal_ax.set_xlabel("时间 (ms)") self.signal_ax.set_ylabel("幅度") self.signal_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.signal_canvas) # 干扰信号波形图 self.jamming_fig = Figure(figsize=(10, 4), dpi=100) self.jamming_canvas = FigureCanvas(self.jamming_fig) self.jamming_ax = self.jamming_fig.add_subplot(111) self.jamming_ax.set_title("干扰信号") self.jamming_ax.set_xlabel("时间 (ms)") self.jamming_ax.set_ylabel("幅度") self.jamming_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.jamming_canvas) # 合成信号波形图 self.combined_fig = Figure(figsize=(10, 4), dpi=100) self.combined_canvas = FigureCanvas(self.combined_fig) self.combined_ax = self.combined_fig.add_subplot(111) self.combined_ax.set_title("合成信号 (GPS + 干扰)") self.combined_ax.set_xlabel("时间 (ms)") self.combined_ax.set_ylabel("幅度") self.combined_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.combined_canvas) return panel def create_position_panel(self): """创建位置显示面板""" panel = QGroupBox("定位信息") layout = QHBoxLayout() panel.setLayout(layout) # 三维位置图 self.position_fig = Figure(figsize=(8, 6), dpi=100) self.position_canvas = FigureCanvas(self.position_fig) self.position_ax = self.position_fig.add_subplot(111, projection='3d') self.position_ax.set_title("卫星与用户位置") self.position_ax.set_xlabel("X (km)") self.position_ax.set_ylabel("Y (km)") self.position_ax.set_zlabel("Z (km)") self.position_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.position_canvas) # 定位误差图 self.error_fig = Figure(figsize=(6, 6), dpi=100) self.error_canvas = FigureCanvas(self.error_fig) self.error_ax = self.error_fig.add_subplot(111) self.error_ax.set_title("定位误差分布") self.error_ax.set_xlabel("X误差 (m)") self.error_ax.set_ylabel("Y误差 (m)") self.error_ax.grid(True, linestyle='--', alpha=0.6) layout.addWidget(self.error_canvas) return panel def create_status_panel(self): """创建状态显示面板""" panel = QFrame() panel.setFrameShape(QFrame.StyledPanel) layout = QHBoxLayout() panel.setLayout(layout) # 定位状态 position_status = QGroupBox("定位状态") pos_layout = QVBoxLayout() position_status.setLayout(pos_layout) self.position_label = QLabel("定位模式: 三维定位") self.position_label.setFont(QFont("Arial", 14)) self.position_label.setStyleSheet("color: #00FF00;") pos_layout.addWidget(self.position_label) self.pdop_label = QLabel("PDOP: 1.0") self.pdop_label.setFont(QFont("Arial", 12)) pos_layout.addWidget(self.pdop_label) self.hdop_label = QLabel("HDOP: 0.8") self.hdop_label.setFont(QFont("Arial", 12)) pos_layout.addWidget(self.hdop_label) self.vdop_label = QLabel("VDOP: 0.6") self.vdop_label.setFont(QFont("Arial", 12)) pos_layout.addWidget(self.vdop_label) layout.addWidget(position_status) # 干扰状态 jam_status = QGroupBox("干扰状态") jam_layout = QVBoxLayout() jam_status.setLayout(jam_layout) self.jam_status_label = QLabel("干扰强度: 弱") self.jam_status_label.setFont(QFont("Arial", 14)) self.jam_status_label.setStyleSheet("color: #FFA500;") jam_layout.addWidget(self.jam_status_label) self.jam_power_label = QLabel("干扰功率: -100 dBW") self.jam_power_label.setFont(QFont("Arial", 12)) jam_layout.addWidget(self.jam_power_label) self.jam_effect_label = QLabel("干扰效果: 无") self.jam_effect_label.setFont(QFont("Arial", 12)) jam_layout.addWidget(self.jam_effect_label) layout.addWidget(jam_status) # 系统状态 sys_status = QGroupBox("系统状态") sys_layout = QVBoxLayout() sys_status.setLayout(sys_layout) self.sys_status_label = QLabel("系统运行: 正常") self.sys_status_label.setFont(QFont("Arial", 14)) self.sys_status_label.setStyleSheet("color: #00FF00;") sys_layout.addWidget(self.sys_status_label) self.sample_rate_status = QLabel("采样率: 100 MS/s") self.sample_rate_status.setFont(QFont("Arial", 12)) sys_layout.addWidget(self.sample_rate_status) self.freq_range_status = QLabel("频率范围: 1570-1580 MHz") self.freq_range_status.setFont(QFont("Arial", 12)) sys_layout.addWidget(self.freq_range_status) layout.addWidget(sys_status) return panel def update_simulation(self): """更新仿真数据并刷新界面""" # 生成信号数据 t, signal = self.gps_system.generate_gps_signal() jamming_signal = self.gps_system.generate_interference(t) combined_signal = signal + jamming_signal # 计算定位信息 estimated_pos = self.gps_system.calculate_position() pdop, hdop, vdop = self.gps_system.calculate_dop() # 计算干扰强度 jam_power = 10**(self.gps_system.jamming_power/10) # 更新波形图 self.update_waveform_plot(t, signal, jamming_signal, combined_signal) # 更新位置图 self.update_position_plot(estimated_pos) # 更新状态显示 self.update_status(jam_power, pdop, hdop, vdop) # 自动干扰模式 if self.auto_jam_active: self.auto_jamming() def update_waveform_plot(self, t, signal, jamming_signal, combined_signal): """更新波形图""" # 原始信号 self.signal_ax.clear() self.signal_ax.plot(t, signal, 'b-', linewidth=1.5) self.signal_ax.set_title("原始GPS信号") self.signal_ax.set_xlabel("时间 (ms)") self.signal_ax.set_ylabel("幅度") self.signal_ax.grid(True, linestyle='--', alpha=0.6) self.signal_ax.set_xlim(0, self.gps_system.duration) self.signal_canvas.draw() # 干扰信号 self.jamming_ax.clear() self.jamming_ax.plot(t, jamming_signal, 'r-', linewidth=1.5) self.jamming_ax.set_title("干扰信号") self.jamming_ax.set_xlabel("时间 (ms)") self.jamming_ax.set_ylabel("幅度") self.jamming_ax.grid(True, linestyle='--', alpha=0.6) self.jamming_ax.set_xlim(0, self.gps_system.duration) self.jamming_canvas.draw() # 合成信号 self.combined_ax.clear() self.combined_ax.plot(t, combined_signal, 'g-', linewidth=1.5) self.combined_ax.set_title("合成信号 (GPS + 干扰)") self.combined_ax.set_xlabel("时间 (ms)") self.combined_ax.set_ylabel("幅度") self.combined_ax.grid(True, linestyle='--', alpha=0.6) self.combined_ax.set_xlim(0, self.gps_system.duration) self.combined_canvas.draw() def update_position_plot(self, estimated_pos): """更新位置图""" # 清除旧的图形 self.position_ax.clear() # 设置标题和标签 self.position_ax.set_title("卫星与用户位置") self.position_ax.set_xlabel("X (km)") self.position_ax.set_ylabel("Y (km)") self.position_ax.set_zlabel("Z (km)") self.position_ax.grid(True, linestyle='--', alpha=0.6) # 设置坐标轴范围 self.position_ax.set_xlim(0, 25000) self.position_ax.set_ylim(0, 25000) self.position_ax.set_zlim(0, 25000) # 绘制卫星位置 satellite_pos = self.gps_system.satellite_pos self.position_ax.scatter(satellite_pos[0], satellite_pos[1], satellite_pos[2], c='red', s=100, marker='^', label='卫星') # 绘制用户真实位置 user_pos = self.gps_system.user_pos self.position_ax.scatter(user_pos[0], user_pos[1], user_pos[2], c='blue', s=100, marker='o', label='真实位置') # 绘制估计位置 self.position_ax.scatter(estimated_pos[0], estimated_pos[1], estimated_pos[2], c='green', s=100, marker='x', label='估计位置') # 添加图例 self.position_ax.legend() # 更新画布 self.position_canvas.draw() # 更新误差图 error = estimated_pos - user_pos self.error_ax.clear() self.error_ax.plot(error[0]*1000, error[1]*1000, 'ro', markersize=10) self.error_ax.set_title("定位误差分布") self.error_ax.set_xlabel("X误差 (m)") self.error_ax.set_ylabel("Y误差 (m)") self.error_ax.axis('equal') self.error_ax.grid(True, linestyle='--', alpha=0.6) self.error_ax.set_xlim(-100, 100) self.error_ax.set_ylim(-100, 100) self.error_canvas.draw() def update_status(self, jam_power, pdop, hdop, vdop): """更新状态显示""" # 更新DOP值 self.pdop_label.setText(f"PDOP: {pdop:.2f}") self.hdop_label.setText(f"HDOP: {hdop:.2f}") self.vdop_label.setText(f"VDOP: {vdop:.2f}") # 定位精度评估 if pdop < 2: self.position_label.setText("定位模式: 精密定位") self.position_label.setStyleSheet("color: #00FF00;") elif pdop < 5: self.position_label.setText("定位模式: 良好定位") self.position_label.setStyleSheet("color: #7CFC00;") elif pdop < 10: self.position_label.setText("定位模式: 一般定位") self.position_label.setStyleSheet("color: #FFD700;") else: self.position_label.setText("定位模式: 低精度定位") self.position_label.setStyleSheet("color: #FF4500;") # 干扰状态 self.jam_power_label.setText(f"干扰功率: {self.gps_system.jamming_power} dBW") if jam_power < 1e-12: # -120 dBW self.jam_status_label.setText("干扰强度: 无") self.jam_status_label.setStyleSheet("color: #00FF00;") elif jam_power < 1e-10: # -100 dBW self.jam_status_label.setText("干扰强度: 弱") self.jam_status_label.setStyleSheet("color: #7CFC00;") elif jam_power < 1e-8: # -80 dBW self.jam_status_label.setText("干扰强度: 中") self.jam_status_label.setStyleSheet("color: #FFA500;") else: self.jam_status_label.setText("干扰强度: 强") self.jam_status_label.setStyleSheet("color: #FF4500;") # 干扰效果评估 if pdop > 10: self.jam_effect_label.setText("干扰效果: 严重") elif pdop > 5: self.jam_effect_label.setText("干扰效果: 显著") elif pdop > 2: self.jam_effect_label.setText("干扰效果: 轻微") else: self.jam_effect_label.setText("干扰效果: 无") # 系统状态 self.sample_rate_status.setText(f"采样率: {self.gps_system.sample_rate} MS/s") def auto_jamming(self): """自动干扰模式""" # 随机改变干扰参数 if np.random.rand() < 0.1: self.jam_type_combo.setCurrentIndex(np.random.randint(1, 5)) if np.random.rand() < 0.2: new_freq = max(1570, min(1580, self.gps_system.jamming_freq + np.random.uniform(-0.5, 0.5))) self.jam_freq_spin.setValue(new_freq) if np.random.rand() < 0.3: new_power = max(-150, min(-50, self.gps_system.jamming_power + np.random.randint(-5, 5))) self.jam_power_slider.setValue(int(new_power)) if self.gps_system.jamming_type == "Spoofing" and np.random.rand() < 0.2: new_delay = max(0.01, min(1.0, self.gps_system.spoofing_delay + np.random.uniform(-0.05, 0.05))) self.spoofing_delay_spin.setValue(new_delay) if self.gps_system.jamming_type == "Spoofing" and np.random.rand() < 0.1: new_count = max(1, min(5, self.gps_system.spoofing_count + np.random.randint(-1, 2))) self.spoofing_count_spin.setValue(new_count) def toggle_auto_jam(self): """切换自动干扰模式""" self.auto_jam_active = not self.auto_jam_active if self.auto_jam_active: self.auto_jam_btn.setText("停止干扰") self.auto_jam_btn.setStyleSheet("background-color: #FF4500;") else: self.auto_jam_btn.setText("自动干扰") self.auto_jam_btn.setStyleSheet("") def optimize_positioning(self): """优化定位参数""" # 简单优化策略:避开干扰频率 if self.gps_system.jamming_type != "None" and self.gps_system.jamming_freq > 0: # 尝试调整卫星编号以避开干扰 new_id = (self.gps_system.satellite_id % 32) + 1 self.sat_id_spin.setValue(new_id) self.position_label.setText("定位模式: 卫星切换中") def reset_params(self): """重置参数到默认值""" self.gps_system = GPSSystem() # 重置卫星参数 self.sat_id_spin.setValue(self.gps_system.satellite_id) self.freq_spin.setValue(self.gps_system.carrier_freq) self.power_slider.setValue(int(self.gps_system.signal_power)) # 重置干扰参数 self.jam_type_combo.setCurrentText(self.gps_system.jamming_type) self.jam_power_slider.setValue(int(self.gps_system.jamming_power)) self.jam_freq_spin.setValue(self.gps_system.jamming_freq) self.spoofing_delay_spin.setValue(self.gps_system.spoofing_delay) self.spoofing_count_spin.setValue(self.gps_system.spoofing_count) # 重置环境参数 self.iono_slider.setValue(int(self.gps_system.iono_delay)) self.multipath_slider.setValue(int(self.gps_system.multipath * 100)) # 重置系统参数 self.sample_rate_spin.setValue(self.gps_system.sample_rate) self.noise_slider.setValue(int(self.gps_system.noise_power)) # 重置自动干扰状态 self.auto_jam_active = False self.auto_jam_btn.setText("自动干扰") self.auto_jam_btn.setStyleSheet("") # 参数更新函数 def update_sat_id(self, value): self.gps_system.satellite_id = value def update_carrier_freq(self, value): self.gps_system.carrier_freq = value def update_signal_power(self, value): self.gps_system.signal_power = value def update_jam_type(self, text): self.gps_system.jamming_type = text def update_jam_power(self, value): self.gps_system.jamming_power = value def update_jam_freq(self, value): self.gps_system.jamming_freq = value def update_spoofing_delay(self, value): self.gps_system.spoofing_delay = value def update_spoofing_count(self, value): self.gps_system.spoofing_count = value def update_iono_delay(self, value): self.gps_system.iono_delay = value def update_multipath(self, value): self.gps_system.multipath = value / 100.0 def update_sample_rate(self, value): self.gps_system.sample_rate = value def update_noise_power(self, value): self.gps_system.noise_power = value if __name__ == "__main__": app = QApplication(sys.argv) window = GPSJammingSimulator() window.show() sys.exit(app.exec_()) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值