RadioML 2016.10a 调制方式识别-IQ分量

文章目录

  • RadioML 2016.10a 调制方式识别-IQ分量
    • 一、IQ分量
      • 什么是 IQ 分量?
      • 为什么使用 IQ 分量?
      • 如何还原原始波形?
      • 如何进行傅里叶变换?
    • 二、信号还原
      • 1、还原信号
      • 2、快速傅里叶变换
      • 3、频率域图
    • 三、可视化
      • 1、时间域图
      • 2、 功率谱图
    • 四、幅度或相位
      • 幅度和相位计算
      • 使用幅度和相位
      • 优势和应用场景
    • 五、其他表达方式
      • 1、IQ堆叠(2,128)
      • 2、IQ线性展开(1,256)
      • 3、幅度(1,128)
      • 4、相位(1,128)
      • 5、幅度和相位堆叠(128,2)
      • 6、幅度和相位展开(256,1)
    • 六、Transformer

RadioML 2016.10a 调制方式识别-IQ分量

AutoSMC: An Automated Machine Learning Framework for Signal Modulation Classification

image-20240619175509771

image-20240619175436343

根据实验结果来看,在-6dB的表现情况在60%左右,6bB下在93%左右

image-20240619175851152

在之前的两篇文章中仅仅是对数据直接重构分析,忽略了IQ分量应该共同进行描述描述

  • RadioML2016.10.a数据加载和介绍-CSDN博客
  • RadioML 2016.10a 调制方式识别-CSDN博客

本篇内容在于介绍并利用IQ分量,并介绍IQ分量的其他表达方式

项目地址:https://github.com/daetz-coder/RadioML2016.10a_CNN

数据地址:https://pan.baidu.com/s/1sxyWf4M0ouAloslcXSJe9w?pwd=2016

一、IQ分量

什么是 IQ 分量?

在无线通信中,信号通常表达为复数形式,这就是所谓的 I/Q 格式,其中:

  • I 代表 In-phase 分量,即信号的实部。
  • Q 代表 Quadrature 分量,即信号的虚部,与 I 分量正交(相位差 90 度)。

这种表示法使得信号可以在同一频带内携带更多的信息,并且有效地描述信号的振幅和相位,这对于调制和解调技术至关重要。

为什么使用 IQ 分量?

  1. 容量增加:使用 I 和 Q 两个正交分量,可以在同一频带宽度内传输双倍的数据,提高频谱效率。
  2. 信号处理的灵活性:I/Q 表示法可以方便地实施各种信号处理技术,如调制、解调、滤波和频谱分析。
  3. 支持多种调制方案:利用 I 和 Q 分量,可以实现各种调制技术,包括最常用的 QAM、QPSK 等。
  4. 精确表达信号:I/Q 数据能够精确描述信号的变化,包括幅度和相位的变化,这对于通信系统中信号的恢复非常重要。

如何还原原始波形?

从 I/Q 数据还原原始波形,主要是将这些复数数据转换为时域信号。这可以通过以下数学公式进行:

image-20240619183323059其中,fc 是载波频率,t是时间。

这个公式显示了如何将 I 分量与余弦波(同相位)和 Q 分量与正弦波(正交相位)相乘后相减,从而构造出时域中的原始信号。

如何进行傅里叶变换?

傅里叶变换是将时域信号转换为频域信号的过程。对于 I/Q 数据,可以分别对 I 和 Q 分量进行傅里叶变换:

  1. 对 I 和 Q 分量进行离散傅里叶变换(DFT):这通常通过快速傅里叶变换(FFT)算法实现。
  2. 解析频谱:对 I 和 Q 分量的变换结果可以组合起来分析整个信号的频谱特性。

例如,使用 NumPy 进行 FFT 可以这样实现:

import numpy as np
I = np.array(...)  # I 分量
Q = np.array(...)  # Q 分量
complex_signal = I + 1j*Q  # 构建复数信号
fft_result = np.fft.fft(complex_signal)  # 对复数信号进行 FFT

二、信号还原

import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv("output_data_multi.csv")

# 提取 I 和 Q 分量
I_components = df.loc[:, "Sample_0":"Sample_127"].values  # 前128个样本为I分量
Q_components = df.loc[:, "Sample_128":"Sample_255"].values  # 接下来128个样本为Q分量

# 重构数据为复数形式,其中 I 为实部,Q 为虚部
complex_data = I_components + 1j * Q_components

# 保留调制类型和信噪比信息
mod_type = df["Mod_Type"]
snr = df["SNR"]

# 现在 complex_data 是一个包含复数信号的 NumPy 数组,mod_type 和 snr 是 Series 对象包含对应的调制类型和信噪比信息
complex_data[:1]
array([[-5.90147120e-03-0.00779554j, -2.34581790e-03-0.00781637j,
        -7.45061260e-04-0.00401967j, -5.34572450e-03-0.00511351j,
        -5.78941800e-03-0.00593952j, -3.69683500e-03-0.0065699j ,
        -4.97868750e-03-0.00558479j, -6.56572800e-03-0.00529769j,
        -9.04932200e-03+0.00021024j, -4.83668640e-03-0.00604725j,
        -1.00837140e-02-0.00705299j, -4.53815700e-03-0.00768376j,
        -4.31498840e-03-0.00682943j, -5.13423300e-03-0.00526323j,
        -6.07567300e-03-0.00428441j,  1.18665890e-03-0.00823529j,
        -4.65670100e-03-0.00887949j, -6.95332750e-03-0.00665625j,
        -6.66823420e-03-0.00873265j, -6.43977240e-03-0.00415313j,
        -3.82532270e-03-0.00815829j, -8.38821850e-03-0.00602711j,
        -1.01344110e-02-0.01298266j, -6.90073200e-03-0.00686788j,
        -9.62839300e-03-0.00674923j, -1.55354580e-03-0.00403722j,
        -2.88469440e-03-0.00778409j, -4.51788800e-03-0.00531385j,
         3.41027650e-03+0.00321187j,  7.41052260e-03-0.00500479j,
         3.35769330e-03+0.00121511j,  7.62627900e-03+0.00072439j,
         8.82679400e-03+0.00443489j,  3.42824610e-03+0.0083125j ,
         1.84084000e-03+0.00883208j,  6.41621460e-03+0.0059255j ,
        -1.63305740e-04+0.00833821j, -2.24135860e-03+0.00718797j,
        -5.19226260e-03+0.00816119j, -3.63920980e-03+0.00870452j,
        -1.01316330e-02+0.00650418j, -6.39987200e-03+0.00439436j,
        -6.06458450e-03+0.00282486j, -7.66557640e-03+0.00216367j,
        -3.44835570e-03+0.00520329j,  4.42530580e-04+0.00740604j,
         2.56719800e-03+0.00053031j,  4.74520000e-03+0.00502639j,
         4.66336500e-03+0.00479635j,  6.47741840e-03+0.00892057j,
         8.53952900e-03+0.00727959j,  4.98457070e-03+0.00410889j,
         1.83550680e-04-0.00164091j,  2.53180620e-04+0.00032166j,
        -2.90070500e-03-0.00435043j, -5.35907460e-03-0.00534027j,
        -9.30814800e-03-0.00672173j, -5.05294140e-03-0.00410643j,
        -4.83987950e-03-0.00531335j,  1.17973956e-04-0.00456619j,
        -5.48875540e-04-0.00476122j,  8.79733360e-04-0.00262099j,
         6.80832940e-03+0.00264574j,  8.02225800e-03+0.00791668j,
         8.17798450e-03+0.00810155j,  6.84361200e-03+0.00856092j,
         3.34831540e-03+0.00586885j,  2.62019620e-03+0.0090829j ,
        -2.50967550e-03+0.00278104j, -6.09290500e-04-0.00458179j,
        -8.00378100e-03-0.00078458j, -1.06874220e-02+0.00190195j,
        -8.18693600e-03-0.00514773j, -9.52030600e-03-0.00967547j,
        -4.64970530e-03-0.00738798j, -1.15614310e-03-0.00874938j,
         2.20692440e-03-0.00441817j,  4.98547300e-03-0.00172313j,
         2.16765120e-03-0.00309234j,  6.35635430e-03-0.0008443j ,
         1.04583080e-02+0.00702607j,  7.48503440e-03+0.00947603j,
         6.23615830e-03+0.00366654j,  2.93730760e-03+0.00918464j,
         1.16433020e-03+0.00436038j,  2.31683560e-04+0.00822378j,
        -4.89262350e-03+0.00838072j, -3.32372940e-03+0.0072375j ,
        -6.60865700e-03+0.00306395j, -4.91313600e-03+0.00747482j,
        -7.29229100e-03+0.00292273j, -6.01531470e-03+0.00505259j,
        -1.28758220e-03+0.00033149j,  4.22199520e-04+0.00930912j,
         2.63322060e-04+0.00462913j,  3.07579040e-03+0.00658605j,
         3.98740960e-03+0.00548608j,  3.42952720e-03+0.00639373j,
         2.69522470e-03+0.00506808j,  7.13837430e-03+0.00556591j,
         6.24447500e-03+0.00681962j,  6.12162850e-03+0.0091046j ,
         5.42381820e-03+0.00839265j,  1.00702720e-03+0.00871987j,
         9.82678100e-04+0.01014247j,  1.36985770e-03+0.00758515j,
         3.53600270e-03+0.00481515j,  4.30495700e-03+0.00565554j,
         8.39837300e-03+0.00265674j,  8.00060500e-03-0.00235612j,
         6.66820200e-03-0.00501084j,  8.24876000e-03-0.00279375j,
         6.43996850e-03-0.00482372j,  1.07639670e-02-0.00445632j,
         6.80366070e-03-0.00213765j,  2.71986000e-03-0.00170917j,
         6.70633800e-05-0.00275444j,  2.20027730e-03-0.00213406j,
         9.56511500e-04-0.00033254j, -1.03281380e-03-0.00055647j,
        -5.32025420e-03+0.00808902j, -7.41181000e-03+0.00666311j,
        -7.29165800e-03+0.00731658j,  1.09607930e-04+0.00554266j,
        -3.40843060e-03+0.00534808j, -3.26823540e-03+0.01032196j,
        -3.04144340e-03+0.00841506j,  5.69031200e-03+0.00544548j]])

1、还原信号

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
fs = 200e3  # 采样率,200kHz
fc = 100e3  # 假设的载波频率,可以根据实际情况调整
t = np.arange(128) / fs  # 生成时间数组,对于每个样本128个点

# 生成载波
cos_wave = np.cos(2 * np.pi * fc * t)  # 余弦载波
sin_wave = np.sin(2 * np.pi * fc * t)  # 正弦载波

df = pd.read_csv("output_data_multi.csv")
# 提取 I 和 Q 分量
I_components = df.loc[:, "Sample_0":"Sample_127"].values  # 前128个样本为I分量
Q_components = df.loc[:, "Sample_128":"Sample_255"].values  # 接下来128个样本为Q分量
# 重构数据为复数形式,其中 I 为实部,Q 为虚部
complex_data = I_components + 1j * Q_components

# 选择一个样本进行还原,这里假设选择第一个样本
sample_signal = complex_data[0]

# 还原信号
restored_signal = np.real(sample_signal) * cos_wave - np.imag(sample_signal) * sin_wave

# 绘制还原的信号
plt.figure(figsize=(10, 5))
plt.plot(t, restored_signal, label='Restored Signal')
plt.title('Restored Signal from I/Q Components')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.legend()
plt.show()

image-20240619192457044

2、快速傅里叶变换

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 加载数据
df = pd.read_csv("output_data_multi.csv")

# 提取 I 和 Q 分量
I_components = df.loc[:, "Sample_0":"Sample_127"].values  # 前128个样本为I分量
Q_components = df.loc[:, "Sample_128":"Sample_255"].values  # 接下来128个样本为Q分量

# 重构数据为复数形式,其中 I 为实部,Q 为虚部
complex_data = I_components + 1j * Q_components

# 保留调制类型和信噪比信息
mod_type = df["Mod_Type"]
snr = df["SNR"]

# 我们取第一个样本来进行FFT
sample_signal = complex_data[1]

# 对该样本进行快速傅里叶变换
fft_result = np.fft.fft(sample_signal)

# 计算频率轴的刻度
n = len(sample_signal)
frequency = np.fft.fftfreq(n, d=1/200000)  # d 是采样间隔,对应的采样率是200kHz

# 绘制FFT结果的幅度谱
plt.figure(figsize=(12, 6))
plt.plot(frequency, np.abs(fft_result))
plt.title('Frequency domain of the signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.grid(True)
plt.show()

3、频率域图

image-20240619193338379

三、可视化

image-20240619190218052

1、时间域图

import numpy as np
import matplotlib.pyplot as plt

# 假设 complex_data 包含了多个信号样本,我们取第一个样本
sample_signal = complex_data[0]

# 生成时间轴
fs = 200000  # 采样率200kHz
t = np.arange(len(sample_signal)) / fs  # 时间向量

# 绘制时间域图
plt.figure(figsize=(12, 6))
plt.plot(t, np.real(sample_signal), label='Real Part')
plt.plot(t, np.imag(sample_signal), label='Imaginary Part', linestyle='--')
plt.title('Time Domain Signal')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid(True)
plt.show()

image-20240619190546978

2、 功率谱图

通过计算信号的傅里叶变换的平方的模来得到

# 对信号进行快速傅里叶变换
fft_result = np.fft.fft(sample_signal)

# 计算功率谱
power_spectrum = np.abs(fft_result)**2

# 生成频率轴
n = len(sample_signal)
frequency = np.fft.fftfreq(n, d=1/fs)

# 绘制功率谱图
plt.figure(figsize=(12, 6))
plt.plot(frequency, power_spectrum)
plt.title('Power Spectrum')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power')
plt.grid(True)
plt.xlim([0, fs/2])  # 通常只显示正频率部分直到Nyquist频率
plt.show()

image-20240619190555567

时间域图中,实部和虚部分别表示了信号的两个正交分量随时间的变化。

功率谱图中,每个频率点的幅度平方表示了该频率成分的能量或功率。通常我们只关注到Nyquist频率(采样率的一半)的正频率部分。

四、幅度或相位

  • 将 IQ (In-phase and Quadrature) 数据表示为单个值的一种常见方法是转换这些分量为幅度 (magnitude) 和相位 (phase)。这种表示有助于捕获信号的本质特性,尤其是在处理通信信号和频域分析时。幅度和相位能够提供关于信号强度和时间变化的信息,这在某些应用场景下比原始的 I 和 Q 分量更有用。

    幅度和相位计算

    幅度 AAA 和相位 ϕ\phiϕ 可以从 I 和 Q 分量通过以下公式计算得出:

image-20240619202313975

import torch

# 假设 I_components 和 Q_components 是包含 I 和 Q 数据的张量
I_components = torch.tensor(data_frame.iloc[:, :128].values, dtype=torch.float32)
Q_components = torch.tensor(data_frame.iloc[:, 128:256].values, dtype=torch.float32)

# 计算幅度和相位
magnitude = torch.sqrt(I_components**2 + Q_components**2)
phase = torch.atan2(Q_components, I_components)

# 可以选择只使用幅度或相位,或者将它们作为两个特征组合使用
features = torch.stack([magnitude, phase], dim=-1)  # 按最后一个维度堆叠

使用幅度和相位

  1. 单一特征选择:如果您想使用单个值来表示 IQ 数据,可以选择使用幅度或相位中的一个。通常,幅度在许多应用中都是非常有用的信息,因为它直接反映了信号的强度。
  2. 特征工程:您可以根据应用的具体需要决定是否需要额外处理这些特征,例如通过标准化或归一化来调整它们的尺度。
  3. 模型输入:计算得到的幅度或相位可以直接用作机器学习模型的输入,尤其是在信号处理和通信系统分析中。

优势和应用场景

  • 通信系统:在处理调制信号时,幅度和相位常常提供了比原始 I/Q 分量更直观的信号特征。
  • 特征简化:在某些情况下,使用幅度或相位可以简化问题的复杂性,减少需要处理的数据量。
  • 性能改进:在某些机器学习任务中,这种转换可能会改善模型的性能,因为它能够捕获信号的关键特性。

总之,通过转换 I 和 Q 分量为幅度和相位,您可以从另一个角度捕捉信号的特性,这可能对于特定的应用场景(如信号分类、检测或其他分析任务)非常有用。这种方法在许多通信领域和信号处理应用中都得到了广泛的使用。

五、其他表达方式

1、IQ堆叠(2,128)

# 提取 I 和 Q 分量
I_components = data_frame.iloc[:, :128].values
Q_components = data_frame.iloc[:, 128:256].values

# 将 I 和 Q 分量堆叠
stacked_components = np.stack((I_components, Q_components), axis=1)

# 转换为torch张量
vectors = torch.tensor(stacked_components, dtype=torch.float32)  # 形状为 [n_samples, 2, 128]

2、IQ线性展开(1,256)

# 提取前256列数据并转换为张量
vectors = torch.tensor(data_frame.iloc[:, :256].values, dtype=torch.float32)

3、幅度(1,128)

# 提取 I 和 Q 分量
I_components = data_frame.iloc[:, :128].values
Q_components = data_frame.iloc[:, 128:256].values

# 计算幅度
magnitude = np.sqrt(I_components**2 + Q_components**2)

image-20240620130003131

4、相位(1,128)

phase = np.arctan2(Q_components, I_components)
phase_tensor = torch.tensor(phase, dtype=torch.float32).unsqueeze(-1)  # 添加特征维度

5、幅度和相位堆叠(128,2)

magnitude = np.sqrt(I_components**2 + Q_components**2)
phase = np.arctan2(Q_components, I_components)
combined = np.stack((magnitude, phase), axis=-1)  # 在特征维度上堆叠
combined_tensor = torch.tensor(combined, dtype=torch.float32)

6、幅度和相位展开(256,1)

magnitude = np.sqrt(I_components**2 + Q_components**2)
phase = np.arctan2(Q_components, I_components)
flattened = np.concatenate((magnitude, phase), axis=1)  # 在序列长度维度上连接
flattened_tensor = torch.tensor(flattened, dtype=torch.float32)

六、Transformer

给出其中的一种模型示例(SNR=6)

# 提取 I 和 Q 分量
I_components = data_frame.iloc[:, :128].values
Q_components = data_frame.iloc[:, 128:256].values

# 将 I 和 Q 分量堆叠
stacked_components = np.stack((I_components, Q_components), axis=1)

# 转换为torch张量
vectors = torch.tensor(stacked_components, dtype=torch.float32)  # 形状为 [n_samples, 2, 128]

class SimpleTransformer(nn.Module):
    def __init__(self, input_dim, num_heads, num_layers, num_classes):
        super(SimpleTransformer, self).__init__()
        self.embedding = nn.Linear(128, input_dim)  # 确保这里从128维映射到input_dim
        encoder_layers = TransformerEncoderLayer(d_model=input_dim, nhead=num_heads)
        self.transformer_encoder = TransformerEncoder(encoder_layer=encoder_layers, num_layers=num_layers)
        self.fc_out = nn.Linear(input_dim, num_classes)
        self.dropout = nn.Dropout(0.3)

    def forward(self, x):
        x = x.permute(1, 0, 2)  # Rearrange input to seq_length, batch_size, features
        
        x = self.embedding(x)
        x = self.transformer_encoder(x)
        x = x.mean(dim=0)  # Aggregate over the sequence
        x = self.dropout(x)
        x = self.fc_out(x)
        return x


# Model instantiation
model = SimpleTransformer(input_dim=16, num_heads=4, num_layers=2, num_classes=11)

image-20240620133634184

image-20240620133643516

image-20240620133650961

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/726363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ecoAddRepeater -loc与-offLoadAtLoc的区别

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ecoAddRepeater -loc {x y} -cell BUF -net NET ecoAddRepeater -offLoadAtLoc {x y} -cell BUF -net NET 都是指定插buf/inv物理位置,区别在于前者用于插buf/inv…

Java多线程+线程池图文实例操作(源码自取)

目录 线程相关概念 并发 并行 继承Thread类 实现Runnable接口 实现Callable接口 使用ExecutorService 和线程池 多线程卖手机 非同步 同步机制卖手机 锁方法 锁代码块 ​编辑锁静态方法 锁静态代码块 线程常用方法 用户线程和守护线程 线程状态 线程池 自定…

Ubuntu/Linux系统安装JDK1.8(带jdk1.8资源和操作教程)

文章目录 前言一、JDK1.8下载二、上传三、安装四、配置环境变量五、查看总结 前言 !!!!!!!!!!!!Ubuntu/Linux jdk1.8安装包&#xff…

手机铃声下载2个必备技巧,定制化铃声,彰显个性魅力

手机铃声,就像是独特的信号灯,不仅仅是通知我们来电或信息的方式,更是展现个人品位和魅力的武器。手机铃声下载和定制,让你的手机从千万舰队中脱颖而出。在接下来的文章中,我们将详细探讨铃声下载技巧的具体操作步骤&a…

第二届人工智能、系统与网络安全国际学术会议 (AISNS 2024)

第二届人工智能、系统与网络安全国际学术会议 (AISNS 2024) 2024 2nd International Conference on Artificial Intelligence, Systems and Network Security 一、重要信息 大会官网:www.aisns.org (点击参会/投稿/了解会议详情&#xff09…

【Java】已解决java.sql.SQLTimeoutException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLTimeoutException异常 在Java的数据库编程中,java.sql.SQLTimeoutException是一个重要的异常,它通常表示在数据库操作(如查询…

Java Array示例说明

Java Array示例说明 数组是相同类型的元素的集合。例如,int数组包含整数元素,String数组包含String元素。Array的元素存储在内存中的相邻位置。Java中的数组基于零基索引系统,这意味着第一个元素位于索引0处。 数组如下所示: i…

C++回溯算法(2)

棋盘问题 #include<bits/stdc.h> using namespace std; void func(int,int); bool tf(int,int); void c(); int n,k; char a[110][110]; int cnt20; int main() {cin>>n>>k;for(int i0;i<n;i){for(int j0;j<n;j){cin>>a[i][j];}}func(0,0);cout…

企业PC端官网在线客服源码系统 完全开源可二开 附带源代码包+搭建部署教程

系统概述 企业 PC 端官网在线客服源码系统是一款专为企业打造的先进客服解决方案。它基于先进的技术架构&#xff0c;旨在为企业提供稳定、高效、功能丰富的在线客服服务。 该系统采用了模块化设计理念&#xff0c;将各个功能模块有机地整合在一起&#xff0c;形成了一个完整…

GPT大模型不再遥不可及:本地化部署让每个人都能拥有

01、本地化部署是GPT发展的一个趋势 我们提到大模型就想到这个东西不是我们普通人可以拥有的&#xff0c;因为太耗费服务器资源&#xff0c;注定了可以提供大模型服务的只能是大厂。 然而有需求就会有解决方案&#xff0c;那就是让大语言模型对特定地区的行业和专业领域有较强…

时间复杂度的相关概念

1. 统计时间增长趋势 时间复杂度分析统计的不是算法运行时间&#xff0c;而是算法运行时间随着数据量变大时的增长趋势&#xff0c;也就是算法运行时间与输入数据的关系。 // 算法 A 的时间复杂度&#xff1a;常数阶 function algorithm_A(n) {console.log(0); } // 算法 B 的…

二叉树(数据结构篇)

数据结构之二叉树 二叉树 概念&#xff1a; 二叉树(binary tree)是一颗每个节点都不能多于两个子节点的树&#xff0c;左边的子树称为左子树&#xff0c;右边的子树称为右子树 性质&#xff1a; 二叉树实际上是图&#xff0c;二叉树相对于树更常用。 平衡二叉树的深度要比…

(3) cmake编译多个cpp文件

文章目录 概要整体代码运行结果 概要 上一节中实现了对单个cpp文件用cmake编译。这一节升级一下 整体代码 main.cpp #include <iostream> #include "person.h"using namespace std;int main() {person me person("langdaoliu", 28, "engin…

nuc算法设计与分析 ppt总结

总纲 插入排序算法 内容&#xff1a; 将数组待排序的元素依次插入到已排序部分&#xff0c;使已排序部分保持升序的性质。 伪代码&#xff1a; 复杂度分析&#xff1a; 时间复杂度为O(n^2)&#xff0c;空间复杂度为O(1)。在数据量较小的情况下&#xff0c;插入排序的效率不输给…

Linux服务器挖矿病毒处理

文章目录 Linux服务器挖矿病毒处理1.中毒表现2.解决办法2.1 断网并修改root密码2.2 找出隐藏的挖矿进程2.3 关闭病毒启动服务2.4 杀掉挖矿进程 3. 防止黑客再次入侵3.1 查找异常IP3.2 封禁异常IP3.3 查看是否有陌生公钥 补充知识参考 Linux服务器挖矿病毒处理 情况说明&#x…

echarts dataZoom用按钮代替鼠标滚轮实现同样效果

2024.06.19今天我学习了echarts dataZoom如何用按钮来控制放大缩小的功能&#xff0c; 效果如下&#xff1a; 通过控制按钮来实现图表放大缩小数据的效果。 步骤如下&#xff1a; 一、写缩放按钮&#xff0c;以及图表数据。 二、设置初始位置的变量&#xff0c;我这边是七个…

InPixio Photo Cutter v10 解锁版安装教程 (懒人抠图工具)

前言 InPixio Photo Cutter是一款懒人抠图工具&#xff0c;采用了增强的算法切割技术&#xff0c;可以在不影响图像质量的情况下&#xff0c;允许用户从照片中删除任何物体或人物&#xff0c;并且保持其完整的质量。你只需点击几下鼠标&#xff0c;便可从照片中剪下任何细节、…

上位机图像处理和嵌入式模块部署(h750 mcu中的pwm控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的pwm&#xff0c;其实就是方波。我们都知道&#xff0c;对于一个电机来说&#xff0c;如果插上正负极的话&#xff0c;那么电机就会全速运转。…

C#.Net筑基-集合知识全解

01、集合基础知识 .Net 中提供了一系列的管理对象集合的类型&#xff0c;数组、可变列表、字典等。从类型安全上集合分为两类&#xff0c;泛型集合 和 非泛型集合&#xff0c;传统的非泛型集合存储为Object&#xff0c;需要类型转。而泛型集合提供了更好的性能、编译时类型安全…

spring cloud Alibaba 整合 seata AT模式

准备工作&#xff1a; 1、MySQL正常安装并启动 2、nacos正常部署并启动 3、下载 Seata-1.4.2 源码包和 seata-server-1.4.2 服务端源码包&#xff08;版本根据自己的需要选择&#xff0c;我这里选择1.4.2&#xff09; 下载地址&#xff1a; Seata&#xff1a;https://gite…