[学习]M-QAM的数学原理与调制解调原理详解(仿真示例)

M-QAM的数学原理与调制解调原理详解

QAM(正交幅度调制)作为现代数字通信的核心技术,其数学原理和实现方法值得深入探讨。本文将分为数学原理、调制解调原理和实现要点三个部分进行系统阐述。

文章目录

  • M-QAM的数学原理与调制解调原理详解
    • 一、数学原理
    • 二、调制原理
    • 三、解调原理
    • 四、实现要点
    • 五、16QAM的Python仿真实现
      • 5.1 完整仿真代码
      • 5.2 关键代码解析
      • 5.3 仿真结果分析
    • 六、性能优化方向
    • 七、MATLAB验证示例
    • 八、工程实现挑战

一、数学原理

  1. 信号空间理论
    M-QAM信号可表示为二维信号空间中的点集:
    s m n ( t ) = A m g ( t ) cos ⁡ ( 2 π f c t ) − B n g ( t ) sin ⁡ ( 2 π f c t ) , m , n = 1 , 2 , . . . , M s_{mn}(t) = A_m g(t)\cos(2\pi f_c t) - B_n g(t)\sin(2\pi f_c t), \quad m,n=1,2,...,\sqrt{M} smn(t)=Amg(t)cos(2πfct)Bng(t)sin(2πfct),m,n=1,2,...,M
    其中:
  • A m A_m Am, B n B_n Bn:离散幅度值
  • g ( t ) g(t) g(t):脉冲成形函数
  • f c f_c fc:载波频率
  1. 星座点能量计算
    对于矩形星座(如16QAM),平均符号能量:
    E a v g = 2 d 2 M ∑ i = 1 M / 2 ( 2 i − 1 ) 2 E_{avg} = \frac{2d^2}{M}\sum_{i=1}^{\sqrt{M/2}}(2i-1)^2 Eavg=M2d2i=1M/2 (2i1)2
    其中 d d d为最小距离,4-QAM时 E a v g = 2 d 2 E_{avg}=2d^2 Eavg=2d2,16-QAM时 E a v g = 10 d 2 E_{avg}=10d^2 Eavg=10d2

  2. 正交性证明
    载波正交性验证:
    ∫ 0 T cos ⁡ ( 2 π f c t ) sin ⁡ ( 2 π f c t ) d t = 0 \int_0^T \cos(2\pi f_c t)\sin(2\pi f_c t)dt = 0 0Tcos(2πfct)sin(2πfct)dt=0
    满足正交条件,实现频谱重叠而不干扰

二、调制原理

  1. 调制过程数学描述
    s ( t ) = ∑ k [ I k g ( t − k T s ) cos ⁡ ( 2 π f c t ) − Q k g ( t − k T s ) sin ⁡ ( 2 π f c t ) ] s(t) = \sum_k [I_k g(t-kT_s)\cos(2\pi f_c t) - Q_k g(t-kT_s)\sin(2\pi f_c t)] s(t)=k[Ikg(tkTs)cos(2πfct)Qkg(tkTs)sin(2πfct)]
    其中 I k I_k Ik, Q k Q_k Qk为第k个符号的同相和正交分量

调制核心方程

s ( t ) = Re [ ∑ k ( a k + j b k ) g ( t − k T s ) e j 2 π f c t ] s(t) = \text{Re}\left[\sum_{k}(a_k + jb_k)g(t-kT_s)e^{j2\pi f_c t}\right] s(t)=Re[k(ak+jbk)g(tkTs)ej2πfct]

  1. 实现步骤

    • 比特分组:每 k = log ⁡ 2 M k=\log_2 M k=log2M比特一组
    • 星座映射:查表法或计算法实现
      # 64QAM映射示例
      def map_64qam(bits):bits = bits.reshape(-1,6)I = 2*(32*(bits[:,0]^bits[:,1]^bits[:,2]) + \4*(bits[:,0]^bits[:,1]) + 2*bits[:,0] - 7Q = 2*(32*(bits[:,3]^bits[:,4]^bits[:,5]) + \4*(bits[:,3]^bits[:,4]) + 2*bits[:,3] - 7return (I + 1j*Q)/np.sqrt(42)
      
    • 脉冲成形:常用升余弦滤波器
      g ( t ) = sinc ( t T s ) cos ⁡ ( π α t / T s ) 1 − ( 2 α t / T s ) 2 g(t) = \text{sinc}(\frac{t}{T_s})\frac{\cos(\pi\alpha t/T_s)}{1-(2\alpha t/T_s)^2} g(t)=sinc(Tst)1(2αt/Ts)2cos(παt/Ts)
    • 正交调制:I/Q两路分别调制
  2. 调制器结构

二进制数据
串并转换
I路映射
Q路映射
脉冲成形
脉冲成形
乘cos载波
乘sin载波
相加输出

三、解调原理

  1. 解调过程数学描述
    相干解调:
    { I k = ∫ r ( t ) g ( t − k T s ) cos ⁡ ( 2 π f c t ) d t Q k = − ∫ r ( t ) g ( t − k T s ) sin ⁡ ( 2 π f c t ) d t \begin{cases} I_k = \int r(t)g(t-kT_s)\cos(2\pi f_c t)dt \\ Q_k = -\int r(t)g(t-kT_s)\sin(2\pi f_c t)dt \end{cases} {Ik=r(t)g(tkTs)cos(2πfct)dtQk=r(t)g(tkTs)sin(2πfct)dt

解调核心方程
r k = ∫ k T s ( k + 1 ) T s r ( t ) g ( t − k T s ) e − j 2 π f c t d t r_k = \int_{kT_s}^{(k+1)T_s} r(t)g(t-kT_s)e^{-j2\pi f_c t}dt rk=kTs(k+1)Tsr(t)g(tkTs)ej2πfctdt

  1. 关键处理步骤

    • 载波同步:Costas环实现
      def costas_loop(signal, fs, fc):phase = 0for n in range(len(signal)):# 相位检测error = np.real(signal[n]) * np.imag(signal[n])# 环路滤波phase -= 0.01 * error# 相位补偿signal[n] *= np.exp(-1j*phase)return signal
      
    • 定时恢复:Gardner算法
    • 均衡处理:LMS自适应均衡
      w n + 1 = w n + μ e n x n ∗ \mathbf{w}_{n+1} = \mathbf{w}_n + \mu e_n \mathbf{x}_n^* wn+1=wn+μenxn
  2. 解调器结构

接收信号
下变频
匹配滤波
定时恢复
采样判决
星座逆映射
并串转换

四、实现要点

  1. 星座图设计

    • Gray编码:相邻星座点仅1比特差异
    • 非矩形星座:如十字形星座(用于32QAM等非2^m情况)
  2. 性能优化技术

    • 软判决解码:利用幅度信息提高解码性能
      def soft_demod(symbol, constellation):distances = np.abs(symbol - constellation)llr = np.log((np.min(distances[::2]) + 1e-10) - \np.log((np.min(distances[1::2]) + 1e-10)return llr
      
    • 自适应调制:根据信道质量动态调整M值
      def adapt_modulation(snr_db):if snr_db > 30: return 256elif snr_db > 20: return 64elif snr_db > 15: return 16else: return 4
      
  3. 性能指标计算

    • 理论BER
      P b ≈ 4 log ⁡ 2 M ( 1 − 1 M ) Q ( 3 log ⁡ 2 M M − 1 E b N 0 ) P_b \approx \frac{4}{\log_2 M}\left(1-\frac{1}{\sqrt{M}}\right)Q\left(\sqrt{\frac{3\log_2 M}{M-1}\frac{E_b}{N_0}}\right) Pblog2M4(1M 1)Q(M13log2MN0Eb )
    • EVM计算
      def calc_evm(tx_symbols, rx_symbols):return 100*np.sqrt(np.mean(np.abs(tx_symbols-rx_symbols)**2)/\np.mean(np.abs(tx_symbols)**2))
      

五、16QAM的Python仿真实现

5.1 完整仿真代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import upfirdnplt.close('all')
# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei']  # 黑体
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False# ================== 参数设置 ==================
M = 16                      # QAM阶数
bits_per_symbol = int(np.log2(M))
num_symbols = 10000         # 发送符号数
sps = 8                     # 每符号采样数
rolloff = 0.4               # 升余弦滚降因子
fs = 1e6                    # 采样率
SNR_dB = 20                 # 信噪比# ================== 16QAM调制 ==================
def qam16_modulate(bits):# 将比特流重塑为每行4比特bits_reshaped = bits.reshape(-1, bits_per_symbol)# 生成16QAM星座图 (Gray编码)constellation = np.array([-3+3j, -3+1j, -3-3j, -3-1j,-1+3j, -1+1j, -1-3j, -1-1j,3+3j,  3+1j,  3-3j,  3-1j,1+3j,  1+1j,  1-3j,  1-1j], dtype=np.complex128)# 归一化因子 (确保平均功率为1)normalization = np.sqrt(np.mean(np.abs(constellation)**2))constellation /= normalization# 将比特映射到符号symbols = np.zeros(len(bits_reshaped), dtype=np.complex128)for i in range(len(bits_reshaped)):# 将4个比特转换为0-15的整数symbol_index = (bits_reshaped[i, 0] << 3) | (bits_reshaped[i, 1] << 2) | (bits_reshaped[i, 2] << 1) | bits_reshaped[i, 3]symbols[i] = constellation[symbol_index]return symbols, constellation# ================== 脉冲成形 ==================
def rrc_filter(sps, rolloff, span=8):"""生成根升余弦滤波器"""t = np.arange(-span*sps, span*sps+1) / spsh = np.zeros_like(t, dtype=np.float64)# 避免除以零for i, t_val in enumerate(t):if abs(t_val) < 1e-8:  # t=0h[i] = 1.0 - rolloff + (4*rolloff/np.pi)elif abs(abs(4*rolloff*t_val) - 1.0) < 1e-8:  # 奇异点h[i] = (rolloff/np.sqrt(2)) * ((1+2/np.pi)*np.sin(np.pi/(4*rolloff)) + (1-2/np.pi)*np.cos(np.pi/(4*rolloff)))else:num = np.sin(np.pi*t_val*(1-rolloff)) + 4*rolloff*t_val*np.cos(np.pi*t_val*(1+rolloff))den = np.pi*t_val*(1 - (4*rolloff*t_val)**2)h[i] = num / den# 归一化滤波器能量h /= np.sqrt(np.sum(h**2))return h# ================== 主程序 - 基带仿真 ==================
if __name__ == "__main__":np.random.seed(42)  # 固定随机种子# 生成随机比特流tx_bits = np.random.randint(0, 2, num_symbols * bits_per_symbol)# =============== 调制过程 ===============# 星座映射tx_symbols, constellation = qam16_modulate(tx_bits)# 创建根升余弦滤波器h_rrc = rrc_filter(sps, rolloff)filter_delay = (len(h_rrc) - 1) // 2  # 计算滤波器延迟# 脉冲成形tx_shaped = upfirdn(h_rrc, tx_symbols, up=sps)# =============== 信道传输 ===============# 添加高斯白噪声 (复噪声)signal_power = np.mean(np.abs(tx_shaped)**2)snr = 10**(SNR_dB/10)noise_power = signal_power / snrnoise_real = np.sqrt(noise_power/2) * np.random.randn(len(tx_shaped))noise_imag = np.sqrt(noise_power/2) * np.random.randn(len(tx_shaped))rx_baseband = tx_shaped + (noise_real + 1j*noise_imag)# =============== 解调过程 ===============# 匹配滤波rx_filtered = upfirdn(h_rrc, rx_baseband)# 修正:计算总延迟(发送滤波+接收滤波)total_delay = 2 * filter_delay# 寻找最佳采样点 (考虑总延迟)start_idx = total_delay# 确保不会超出范围if start_idx + (num_symbols-1)*sps < len(rx_filtered):sampled_points = rx_filtered[start_idx:start_idx+num_symbols*sps:sps]else:# 如果超出范围,只取有效部分sampled_points = rx_filtered[start_idx::sps]# 修正:截断到与发射符号相同长度min_len = min(len(tx_symbols), len(sampled_points))sampled_points = sampled_points[:min_len]# 修正:相位补偿if min_len > 0:# 使用已知符号估计相位误差phase_error = np.angle(np.sum(sampled_points * np.conj(tx_symbols[:min_len])))compensated_points = sampled_points * np.exp(-1j * phase_error)else:compensated_points = sampled_points# 最小距离判决(使用相位补偿后的信号)symbol_indices = np.zeros(len(compensated_points), dtype=int)for i, s in enumerate(compensated_points):# 计算到所有星座点的距离distances = np.abs(s - constellation)# 找到最小距离的星座点索引symbol_indices[i] = np.argmin(distances)# 符号转比特rx_bits = np.zeros(len(symbol_indices) * bits_per_symbol, dtype=int)for i, idx in enumerate(symbol_indices):# 将符号索引转换为比特for j in range(bits_per_symbol):# 从最高位开始提取比特shift = bits_per_symbol - 1 - jrx_bits[i*bits_per_symbol + j] = (idx >> shift) & 1# =============== 性能分析 ===============# 截断到相同长度min_bit_len = min(len(tx_bits), len(rx_bits))tx_bits_trunc = tx_bits[:min_bit_len]rx_bits_trunc = rx_bits[:min_bit_len]# 误码率计算bit_errors = np.sum(tx_bits_trunc != rx_bits_trunc)ber = bit_errors / min_bit_len if min_bit_len > 0 else 1.0print(f"传输比特数: {min_bit_len}")print(f"误码数: {bit_errors}")print(f"误码率(BER): {ber:.2e}")# EVM计算(使用补偿后信号)if min_len > 0:ref_symbols = tx_symbols[:min_len]rx_symbols_subset = compensated_points# 计算误差矢量幅度evm_numerator = np.sqrt(np.mean(np.abs(rx_symbols_subset - ref_symbols)**2))evm_denominator = np.sqrt(np.mean(np.abs(ref_symbols)**2))evm = evm_numerator / evm_denominatorprint(f"EVM: {evm*100:.2f}%")else:print("EVM: N/A (无接收符号)")# 星座图绘制plt.figure(figsize=(14, 10))# 发射星座图plt.subplot(221)plt.scatter(np.real(tx_symbols), np.imag(tx_symbols), alpha=0.6)plt.title(f"发射星座图 ({len(tx_symbols)} 符号)")plt.grid(True)plt.axis('equal')plt.xlim(-2, 2)plt.ylim(-2, 2)# 接收星座图(使用补偿后信号)plt.subplot(222)if min_len > 0:plt.scatter(np.real(compensated_points), np.imag(compensated_points), alpha=0.6, c='r')plt.title(f"接收星座图 (SNR={SNR_dB}dB, BER={ber:.2e})")plt.grid(True)plt.axis('equal')plt.xlim(-2, 2)plt.ylim(-2, 2)else:plt.text(0.5, 0.5, "无接收符号", ha='center', va='center')plt.title("接收星座图 - 无数据")# 眼图绘制if len(rx_filtered) > 3 * sps:# 跳过初始过渡区stable_start = total_delay * 2stable_end = len(rx_filtered) - total_delaystable_signal = rx_filtered[stable_start:stable_end]# I路眼图plt.subplot(223)for i in range(100, min(300, len(stable_signal)//sps - 1)):start = i * spsend = start + 2 * spsif end < len(stable_signal):segment = np.real(stable_signal[start:end])plt.plot(np.linspace(0, 2, len(segment)), segment, 'b', alpha=0.3)plt.title("I路眼图")plt.grid(True)# Q路眼图plt.subplot(224)for i in range(100, min(300, len(stable_signal)//sps - 1)):start = i * spsend = start + 2 * spsif end < len(stable_signal):segment = np.imag(stable_signal[start:end])plt.plot(np.linspace(0, 2, len(segment)), segment, 'r', alpha=0.3)plt.title("Q路眼图")plt.grid(True)plt.tight_layout()plt.savefig('qam16_baseband_simulation_corrected.png', dpi=300)plt.show()

5.2 关键代码解析

  1. 星座映射
constellation = {0: (-3+3j), 1: (-3+1j), 2: (-3-3j), 3: (-3-1j),4: (-1+3j), 5: (-1+1j), 6: (-1-3j), 7: (-1-1j),8: (3+3j),  9: (3+1j),  10:(3-3j), 11:(3-1j),12:(1+3j), 13:(1+1j),  14:(1-3j), 15:(1-1j)
}

采用Gray编码排列,最小化相邻星座点的比特差异

  1. 脉冲成形
h = np.sinc(t) * np.cos(np.pi*rolloff*t) / (1 - (2*rolloff*t)**2)

升余弦滤波器设计,控制符号间干扰(ISI)

  1. 最佳接收
filtered = upfirdn(h, signal, down=sps)

匹配滤波最大化信噪比

5.3 仿真结果分析

结果输出

传输比特数: 40000
误码数: 0
误码率(BER): 0.00e+00
EVM: 3.55%

结果可视化

在这里插入图片描述
更多仿真
调制SNR_dB 参数,可以观察不同信噪比下的仿真结果。

六、性能优化方向

  1. 信道均衡
# LMS自适应均衡示例
def lms_equalizer(rx_signal, training_seq, num_taps=5, mu=0.01):w = np.zeros(num_taps, dtype=complex)for n in range(len(training_seq)-num_taps):x = rx_signal[n:n+num_taps]e = training_seq[n] - np.dot(w, x)w += mu * e * np.conj(x)return w
  1. 载波同步

    • Costas环实现
    • 频偏估计算法
  2. 自适应调制

    • 根据信道质量动态调整QAM阶数
    • 算法实现:
      def adapt_modulation(snr_db):if snr_db > 25: return 64elif snr_db > 15: return 16else: return 4
      

七、MATLAB验证示例

提供一个简单的matlab示例,有兴趣的可以根据这个调整一下,用于和前文Python仿真的对比。

% 16QAM调制解调示例
M = 16; 
data = randi([0 M-1],1000,1);
txSig = qammod(data,M,'UnitAveragePower',true);% 加噪
SNR = 20;
rxSig = awgn(txSig,SNR,'measured');% 解调
rxData = qamdemod(rxSig,M,'UnitAveragePower',true);% 计算BER
ber = sum(data ~= rxData)/length(data);
constellation = qammod(0:M-1,M,'UnitAveragePower',true);
scatterplot(rxSig);
hold on; plot(constellation,'r*'); hold off;

八、工程实现挑战

  1. 载波同步:频偏补偿精度需达 0.01 % 0.01\% 0.01%以内
  2. 定时同步:采样时钟偏差需小于 100 100 100ppm
  3. 非线性失真:功率放大器AM-AM/AM-PM效应补偿
    def digital_predistorter(signal, pa_model):# 基于查找表的预失真return np.interp(np.abs(signal), pa_model['amp_in'], pa_model['amp_out']) * \np.exp(1j*np.interp(np.abs(signal), pa_model['phase_in'], pa_model['phase_out']))
    

代码调试是真耗费时间精力,对您有帮助请点赞关注支持~~


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图书管理系统练习项目源码-前后端分离-使用node.js来做后端开发

前端学习了这么久了&#xff0c;node.js 也有了一定的了解&#xff0c;知道使用node也可以来开发后端&#xff0c;今天给大家分享 使用node 来做后端&#xff0c;vue来写前端&#xff0c;做一个简单的图书管理系统。我们在刚开始学习编程的时候&#xff0c;需要自己写大量的项目…

【甲方安全视角】企业建设下的安全运营

文章目录 一、安全运营的概念与起源二、安全运营的职责与定位三、安全运营工程师的核心能力要求四、安全运营的典型场景与应对技巧1. 明确责任划分,避免“医生做保姆”2. 推动机制:自下而上 vs. 自上而下3. 宣传与内部影响力建设五、安全运营的战略意义六、为何需要安全原因在…

03认证原理自定义认证添加认证验证码

目录 大纲 一、自定义资源权限规则 二、自定义登录界面 三、自定义登录成功处理 四、显示登录失败信息 五、自定义登录失败处理 六、注销登录 七、登录用户数据获取 1. SecurityContextHolder 2. SecurityContextHolderStrategy 3. 代码中获取认证之后用户数据 4. 多…

IPLOOK 2025上半年足迹回顾:连接全球,步履不停

2025年上半年&#xff0c;IPLOOK积极活跃于全球通信舞台&#xff0c;足迹横跨亚洲、欧洲、非洲与北美洲&#xff0c;我们围绕5G核心网、私有网络、云化架构等方向&#xff0c;向来自不同地区的客户与合作伙伴展示了领先的端到端解决方案&#xff0c;深入了解各地市场需求与技术…

【Kafka】docker 中配置带 Kerberos 认证的 Kafka 环境(全过程)

1. 准备 docker 下载镜像 docker pull centos/systemd&#xff0c;该镜像是基于 centos7 增加了 systemd 的功能&#xff0c;可以更方便启动后台服务 启动镜像 使用 systemd 功能需要权限&#xff0c;如果是模拟 gitlab services 就不要使用 systemd 的方式启动 如果不使用 s…

用Python构建一个可扩展的多网盘聚合管理工具 (以阿里云盘为例)

摘要 本文旨在从开发者视角&#xff0c;探讨并实践如何构建一个命令行界面的、支持多网盘聚合管理的工具。我们将以阿里云盘为例&#xff0c;深入解析其API认证与核心操作&#xff0c;并用Python从零开始实现文件列表、重命名、分享等功能。更重要的是&#xff0c;本文将重点讨…

筑牢网络安全屏障

在数字化浪潮席卷全球的今天&#xff0c;网络空间已成为继陆、海、空、天之后的 “第五疆域”&#xff0c;深刻影响着国家政治、经济、军事等各个领域。“没有网络安全就没有国家安全”&#xff0c;这句论断精准道出了网络安全与国家安全之间密不可分的关系。​ 网络安全关乎国…

计算机网络(一)层

一、分层 分层的意义&#xff1a;简化复杂性、提高灵活性、促进标准化 &#xff08;1&#xff09;法律上国际标准——OSI体系结构 &#xff08;2&#xff09;事实上的网络标准——TCP/IP体系结构 TCP&#xff1a;运输层的协议 IP&#xff1a;网际层的一个协议 网络接口层&…

STM32 rs485实现中断DMA模式收发不定长数据

在STM32F103上使用TD301D485H模块通过USB转485/422串口线与电脑通信 TXD (TD301D485H) -> PA2 (STM32F103)RXD (TD301D485H) -> PA3 (STM32F103)CON (TD301D485H) -> PA1 (STM32F103) 由于485是半双工通信&#xff0c;需要在发送和接收时控制方向引脚&#xff08;CO…

DDL-8-小结

DDL 小结 DDL 小结 DDL 小结DDL - 数据库操作DDL - 表操作 DDL - 数据库操作 查看当前有哪些数据库 SHOW DATABASES;新建数据库 CREATE DATABASE 数据库名;使用数据库 USE 数据库名;查询当前数据库 SELECT DATABASE();删除数据库 DROP DATABASE 数据库名;DDL - 表操作 查看当前…

Redis 安装使用教程

一、Redis 简介 Redis 是一个开源&#xff08;BSD 许可&#xff09;、内存数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。支持字符串、哈希、列表、集合、有序集合等数据类型&#xff0c;广泛应用于分布式缓存、排行榜、实时数据分析等场景。 二、下载安装…

Go语言测试与调试:单元测试与基准测试

以下是《Go语言实战指南》中关于 测试与调试&#xff1a;单元测试与基准测试 的详细内容&#xff0c;涵盖测试编写、运行、覆盖率分析与性能测试&#xff0c;适用于实际项目开发与性能优化阶段。 一、Go 的测试体系概览 Go 提供原生的测试工具包 testing&#xff0c;无需第三方…

数字FIR-I型滤波器设计(窗函数法)

目录 一、实验目的 二、实验原理 2.1 概念辨析 2.2 代码实现逻辑与工具函数 三、实验内容 3.1 设计带通滤波器&#xff08;电平组合法&#xff0c;&#xff08;理想宽带低通-理想窄带低通&#xff09;x窗函数&#xff09; 3.2 高通滤波器&#xff08;…

RHCSA认证题目练习一(配置网络设置)

一. 题目 配置网络设置 解题过程&#xff1a; 注意&#xff1a;不可以在xshell中完成&#xff0c;否则会直接断联 这里用图形化解题&#xff0c;更加简单防止命令记错 1. 打开图形化视图 命令&#xff1a;nmtui 按回车确认 按回车确认 2.首先把IPv4配置 <自动> 改成 …

STL简介+string模拟实现

STL简介string模拟实现 1. 什么是STL2. STL的版本3. STL的六大组件4.STL的缺陷5. string5.1 C语言中的字符串5.2 1个OJ题 6.标准库中的string类6.1 string类(了解)6.2 string类的常用接口说明1.string类对象的常见构造函数2.析构函数(~string())3.赋值函数 (operator) 6.3 stri…

golang实现一个mysql中随机获取cookies的API

之前用FASTAPI写了一个随机cookies请求的接口,现在尝试用golang实现同样的效果 1.编写go代码 package mainimport ("database/sql""encoding/json""fmt"_ "github.com/go-sql-driver/mysql""log""net/http"&quo…

[Vue2组件]三角形角标

[Vue2组件]三角形角标 <template><div class"ys-subscript" :style"svgStyle"><svg width"200" height"200" viewBox"0 0 200 200" xmlns"http://www.w3.org/2000/svg"><!-- 三角形背景 - 右…

洛谷刷题4

B4354 [GESP202506 一级] 假期阅读 题目传送门 B4354 难度&#xff1a;入门 很简单的题&#xff0c;如果小A看的页数≤这本书的页数&#xff0c;输出他看的页数 否则&#xff0c;输出这本书的页数 AC代码&#xff1a; #include <iostream> using namespace std; in…

【基于Echarts的地图可视化】

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>中国牛只分布可视化</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script><script src"h…

系统架构设计师备考之架构设计基础

1.计算机系统基础知识 1.1.计算机系统概述 计算机系统的定义与组成 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 计算机系统可划分为硬件和软件两部分。硬件由机械、电子元器件、磁介质和光介质等物理实体构成&#xff1b; 软件是一系列按照特定顺序组织…