#下面程序运行时报错,请修改,不要减少功能,给出全部代码
Font 'default' does not have a glyph for '\u2212' [U+2212], substituting with a dummy symbol.
=====================================
import sys
import numpy as np
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QLabel, QSpinBox, \
QComboBox, QPushButton, QFormLayout
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.patches as patches
class SatelliteCommunicationSimulator(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("卫星通信干扰仿真系统")
self.setGeometry(100, 100, 1200, 800)
# 初始化参数
self.init_parameters()
# 创建界面
self.init_ui()
# 初始化显示
self.update_all_plots()
def init_parameters(self):
# 初始参数设置
self.frequency = 2400.0 # MHz
self.data_rate = 100.0 # kbps
self.signal_power = 20.0 # dBm
self.jamming_power = 30.0 # dBm
self.jamming_frequency = 2400.0 # MHz
self.jamming_type = "CW" # CW, FM, AM
self.jamming_mode = "ON" # ON, OFF
# 位置参数
self.aircraft1_pos = [100, 150]
self.aircraft2_pos = [400, 250]
self.satellite_pos = [250, 200]
self.jammer_pos = [150, 100]
# 生成波形数据
self.time = np.linspace(0, 10, 1000)
self.data_signal = np.sin(2 * np.pi * 5 * self.time) + 0.5 * np.sin(2 * np.pi * 10 * self.time)
self.jamming_signal = 2 * np.sin(2 * np.pi * 20 * self.time)
self.combined_signal = self.data_signal + self.jamming_signal
def init_ui(self):
# 创建主窗口部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 创建主布局
main_layout = QHBoxLayout(central_widget)
# 创建控制面板
control_panel = self.create_control_panel()
main_layout.addWidget(control_panel, 1)
# 创建显示区域
display_area = self.create_display_area()
main_layout.addWidget(display_area, 3)
def create_control_panel(self):
# 创建控制面板
control_panel = QWidget()
layout = QVBoxLayout(control_panel)
# 通信参数设置
comm_group = QGroupBox("通信参数设置")
comm_layout = QFormLayout()
self.freq_spin = QSpinBox()
self.freq_spin.setRange(1000, 5000)
self.freq_spin.setValue(int(self.frequency))
self.freq_spin.setSuffix(" MHz")
comm_layout.addRow("频率:", self.freq_spin)
self.data_rate_spin = QSpinBox()
self.data_rate_spin.setRange(1, 1000)
self.data_rate_spin.setValue(int(self.data_rate))
self.data_rate_spin.setSuffix(" kbps")
comm_layout.addRow("数据速率:", self.data_rate_spin)
self.signal_power_spin = QSpinBox()
self.signal_power_spin.setRange(-50, 50)
self.signal_power_spin.setValue(int(self.signal_power))
self.signal_power_spin.setSuffix(" dBm")
comm_layout.addRow("信号功率:", self.signal_power_spin)
comm_group.setLayout(comm_layout)
layout.addWidget(comm_group)
# 干扰参数设置
jammer_group = QGroupBox("干扰参数设置")
jammer_layout = QFormLayout()
self.jamming_power_spin = QSpinBox()
self.jamming_power_spin.setRange(-50, 50)
self.jamming_power_spin.setValue(int(self.jamming_power))
self.jamming_power_spin.setSuffix(" dBm")
jammer_layout.addRow("干扰功率:", self.jamming_power_spin)
self.jamming_freq_spin = QSpinBox()
self.jamming_freq_spin.setRange(1000, 5000)
self.jamming_freq_spin.setValue(int(self.jamming_frequency))
self.jamming_freq_spin.setSuffix(" MHz")
jammer_layout.addRow("干扰频率:", self.jamming_freq_spin)
self.jamming_type_combo = QComboBox()
self.jamming_type_combo.addItems(["CW", "FM", "AM"])
self.jamming_type_combo.setCurrentText(self.jamming_type)
jammer_layout.addRow("干扰类型:", self.jamming_type_combo)
self.jamming_mode_combo = QComboBox()
self.jamming_mode_combo.addItems(["ON", "OFF"])
self.jamming_mode_combo.setCurrentText(self.jamming_mode)
jammer_layout.addRow("干扰模式:", self.jamming_mode_combo)
jammer_group.setLayout(jammer_layout)
layout.addWidget(jammer_group)
# 干扰效果数据显示
effect_group = QGroupBox("干扰效果数据")
effect_layout = QVBoxLayout()
self.snr_label = QLabel("信噪比(SNR): 0.0 dB")
self.ebno_label = QLabel("Eb/No: 0.0 dB")
self.ber_label = QLabel("误码率(BER): 0.00e+00")
effect_layout.addWidget(self.snr_label)
effect_layout.addWidget(self.ebno_label)
effect_layout.addWidget(self.ber_label)
effect_group.setLayout(effect_layout)
layout.addWidget(effect_group)
# 控制按钮
button_layout = QHBoxLayout()
self.start_btn = QPushButton("开始仿真")
self.start_btn.clicked.connect(self.start_simulation)
button_layout.addWidget(self.start_btn)
self.stop_btn = QPushButton("停止仿真")
self.stop_btn.clicked.connect(self.stop_simulation)
button_layout.addWidget(self.stop_btn)
self.reset_btn = QPushButton("重置仿真")
self.reset_btn.clicked.connect(self.reset_simulation)
button_layout.addWidget(self.reset_btn)
layout.addLayout(button_layout)
# 添加弹簧,使控件居中
layout.addStretch()
return control_panel
def create_display_area(self):
# 创建显示区域
display_widget = QWidget()
layout = QVBoxLayout(display_widget)
# 创建matplotlib图形
self.figure = Figure(figsize=(10, 8), dpi=100)
self.canvas = FigureCanvas(self.figure)
layout.addWidget(self.canvas)
# 创建三个子图
self.ax_deployment = self.figure.add_subplot(2, 2, 1)
self.ax_commu = self.figure.add_subplot(2, 2, 2)
self.ax_jammer = self.figure.add_subplot(2, 2, 3)
self.ax_effect = self.figure.add_subplot(2, 2, 4)
self.figure.tight_layout()
return display_widget
def update_all_plots(self):
# 更新所有图表
self.update_deployment_plot()
self.update_waveform_plots()
self.update_effect_data()
def update_deployment_plot(self):
self.ax_deployment.clear()
self.ax_deployment.set_xlim(0, 500)
self.ax_deployment.set_ylim(0, 400)
self.ax_deployment.set_title("卫星通信部署示意")
self.ax_deployment.set_xlabel("X坐标")
self.ax_deployment.set_ylabel("Y坐标")
self.ax_deployment.grid(True)
# 绘制飞机
aircraft1 = patches.Circle(self.aircraft1_pos, 15, color='blue', alpha=0.7)
self.ax_deployment.add_patch(aircraft1)
self.ax_deployment.text(self.aircraft1_pos[0], self.aircraft1_pos[1] - 20,
"飞机1", ha='center', va='center', fontsize=10)
aircraft2 = patches.Circle(self.aircraft2_pos, 15, color='green', alpha=0.7)
self.ax_deployment.add_patch(aircraft2)
self.ax_deployment.text(self.aircraft2_pos[0], self.aircraft2_pos[1] - 20,
"飞机2", ha='center', va='center', fontsize=10)
# 绘制卫星
satellite = patches.Circle(self.satellite_pos, 20, color='red', alpha=0.7)
self.ax_deployment.add_patch(satellite)
self.ax_deployment.text(self.satellite_pos[0], self.satellite_pos[1] - 25,
"卫星", ha='center', va='center', fontsize=10)
# 绘制干扰机
jammer = patches.Circle(self.jammer_pos, 15, color='orange', alpha=0.7)
self.ax_deployment.add_patch(jammer)
self.ax_deployment.text(self.jammer_pos[0], self.jammer_pos[1] - 20,
"干扰机", ha='center', va='center', fontsize=10)
# 绘制连接线
# 飞机1到卫星
self.ax_deployment.plot([self.aircraft1_pos[0], self.satellite_pos[0]],
[self.aircraft1_pos[1], self.satellite_pos[1]],
'b-', linewidth=1, alpha=0.7)
# 卫星到飞机2
self.ax_deployment.plot([self.satellite_pos[0], self.aircraft2_pos[0]],
[self.satellite_pos[1], self.aircraft2_pos[1]],
'g-', linewidth=1, alpha=0.7)
# 干扰机到卫星(如果干扰开启)
if self.jamming_mode == "ON":
self.ax_deployment.plot([self.jammer_pos[0], self.satellite_pos[0]],
[self.jammer_pos[1], self.satellite_pos[1]],
'r--', linewidth=1, alpha=0.7)
self.canvas.draw()
def update_waveform_plots(self):
# 更新波形图表
self.ax_commu.clear()
self.ax_commu.plot(self.time, self.data_signal, 'b-', linewidth=1)
self.ax_commu.set_title("通信信号")
self.ax_commu.set_xlabel("时间 (s)")
self.ax_commu.set_ylabel("幅度")
self.ax_commu.grid(True)
self.ax_jammer.clear()
self.ax_jammer.plot(self.time, self.jamming_signal, 'r-', linewidth=1)
self.ax_jammer.set_title("干扰信号")
self.ax_jammer.set_xlabel("时间 (s)")
self.ax_jammer.set_ylabel("幅度")
self.ax_jammer.grid(True)
self.ax_effect.clear()
self.ax_effect.plot(self.time, self.combined_signal, 'g-', linewidth=1)
self.ax_effect.set_title("混合信号")
self.ax_effect.set_xlabel("时间 (s)")
self.ax_effect.set_ylabel("幅度")
self.ax_effect.grid(True)
self.canvas.draw()
def update_effect_data(self):
# 计算干扰效果数据
snr = self.signal_power - self.jamming_power
ebno = snr # 简化计算
# 简单的BER计算(基于SNR)
ber = 0.5 * np.erfc(np.sqrt(10 ** (ebno / 10) / 2))
self.snr_label.setText(f"信噪比(SNR): {snr:.1f} dB")
self.ebno_label.setText(f"Eb/No: {ebno:.1f} dB")
self.ber_label.setText(f"误码率(BER): {ber:.2e}")
def update_simulation(self):
# 更新仿真参数
self.frequency = float(self.freq_spin.value())
self.data_rate = float(self.data_rate_spin.value())
self.signal_power = float(self.signal_power_spin.value())
self.jamming_power = float(self.jamming_power_spin.value())
self.jamming_frequency = float(self.jamming_freq_spin.value())
self.jamming_type = self.jamming_type_combo.currentText()
self.jamming_mode = self.jamming_mode_combo.currentText()
# 更新波形数据
self.data_signal = np.sin(2 * np.pi * 5 * self.time) + 0.5 * np.sin(2 * np.pi * 10 * self.time)
self.jamming_signal = 2 * np.sin(2 * np.pi * 20 * self.time)
self.combined_signal = self.data_signal + self.jamming_signal
# 更新所有图表
self.update_all_plots()
def start_simulation(self):
# 启动仿真
self.update_simulation()
def stop_simulation(self):
# 停止仿真
pass
def reset_simulation(self):
# 重置仿真
self.freq_spin.setValue(int(self.frequency))
self.data_rate_spin.setValue(int(self.data_rate))
self.signal_power_spin.setValue(int(self.signal_power))
self.jamming_power_spin.setValue(int(self.jamming_power))
self.jamming_freq_spin.setValue(int(self.jamming_frequency))
self.jamming_type_combo.setCurrentText(self.jamming_type)
self.jamming_mode_combo.setCurrentText(self.jamming_mode)
self.update_all_plots()
def closeEvent(self, event):
# 程序关闭时的处理
event.accept()
def main():
app = QApplication(sys.argv)
app.setStyle('Fusion') # 使用Fusion样式,使界面更美观
# 创建并显示主窗口
simulator = SatelliteCommunicationSimulator()
simulator.show()
# 运行应用程序
sys.exit(app.exec_())
if __name__ == "__main__":
main()
最新发布